双下划线表示什么?

6
在Python中,我知道在名称前加上双下划线会导致Python将classname前缀添加到变量名称中,例如_classname__variable(名称混淆)。所以我的问题是,在我被要求修改的Python/Django应用程序中,有一种类型为tr_rowid_debtor__de_listed_date__lte的变量名。这是三个变量(tr_rowid_debtorde_listed_datelte)还是Python的某种特殊构造?它出现在一个构建Django查询字符串的语句中...
query = DeTransaction.objects.select_related().filter(
    tr_rowid_debtor__de_listed_date__lte=to_date,
    tr_rowid_debtor__de_rowid_client__cl_rowid=in_client
).values(
    'tr_rowid_debtor','tr_rowid_debtor__de_listed_date',
    'tr_payment_date','tr_account','tr_to_agency','tr_to_client'
)

如果有任何建议,请不吝赐教。


2
你应该完成Django教程,其中会解释这个构造(用于遍历模型关系)。 - Daniel Roseman
正如@DanielRoseman所说,该条件是使用相关模型的字段进行设置的。另外,为了提高可读性,我将这个一行代码拆分成了多行。 - Joseph Victor Zammit
1个回答

12
双下划线符号是Django ORM用于表示查询中某种分离的标记。在tr_rowid_debtor__de_listed_date__lte的情况下,有三件事情正在发生:
  1. tr_rowid_debtor指定了DeTransaction上的属性,这是基于接下来会发生什么的关系
  2. de_listed_date指定要查询的相关模型的字段
  3. lte表示使用<=(小于或等于)进行比较
阅读Django的查询文档值得一试。它们详细介绍了这些内容。
关于这是否特别适用于Python,其实并不是。双下划线__被赋值给一个常量LOOKUP_SEP。该值与str.split()一起使用,用于生成查询的WHERE子句。

感谢大家的回答,这对我很有帮助。现在正在阅读Django查询文档。最近有没有一本关于Django/Python的好书/电子书? - Gary Ridley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接