双下划线表示什么?

Gar*_*ley 6 python django name-mangling

在 Python 中,我知道名称前面的双下划线会导致 Python 在名称classname前面添加variable,如_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'
)
Run Code Online (Sandbox Code Playgroud)

任何建议在这里将不胜感激。

dir*_*irn 12

Django 的 ORM 使用双下划线表示法来指示查询中的某种分隔。在 的情况下tr_rowid_debtor__de_listed_date__lte,发生了三件事。

  1. tr_rowid_debtor指定 on 的属性DeTransaction,这是基于接下来发生的情况的关系
  2. de_listed_date指定要查询的相关模型的字段
  3. lte<=表示使用(小于或等于)进行比较

值得一读Django 的查询文档。详细介绍了这些内容。

至于这是否是Python特有的,其实不是。被__分配给一个名为 的常量LOOKUP_SEP。该值用于str.split()生成WHERE查询子句。