【问题标题】:Django filtering on foreign key properties, difference between explicit and implicit foreign key property namingDjango过滤外键属性,显式和隐式外键属性命名的区别
【发布时间】:2018-07-24 06:30:20
【问题描述】:

假设我有两个models -

class A(models.Model):
    a_id=models.CharField(max_length=255,primary_key=True)
    a_name=models.CharField(max_length=255)

class B(models.Model):
    a=models.ForeignKey(A)
    b_name=models.CharField(max_length=255)

我想过滤属于特定a_id 的B 对象。我可以这样做 -

B.objects.filter(a=a_id)

或

B.objects.filter(a__a_id=a_id)

两者在效率、速度或功能方面有什么区别吗?

【问题讨论】:

    标签: django django-1.9


    【解决方案1】:

    B.objects.filter(a=a_id) 效率更高,因为它只是过滤 B.a 的值并避免完全连接表 A,而 B.objects.filter(a__a_id=a_id) 需要通过 a_id 连接表 A,然后过滤 a_id a.

    【讨论】:

    • 很抱歉这个后续问题来得太晚了。我打印了这两个操作的查询,它们似乎是等价的。 SELECT "app_B"."id", "app_B"."b_name" from "app_B" WHERE "app_B"."a_id" = 1 LIMIT 21
    • 我明白了。显然,在最近的版本中,Django 已经对这种用法进行了优化。我相当确定他们在早期没有产生相同的 SQL 查询(很久以前我自己检查时我使用的是 Django 1.4)。
    • 我明白了。谢谢。
    猜你喜欢
    • 2010-12-31
    • 2017-02-04
    • 2021-09-04
    • 2022-09-26
    • 2014-09-15
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多