Django通过反向关系与过滤器功能查找元素

时间:2018-08-14 15:50:37

标签: django django-models

我目前正在从事django项目,我正在使用反向关系来查找元素,但同时我也可以使用过滤器功能。

示例模型为:

class Group(models.Model):
    #some attributes

class Profile(models.Model):
    group = models.ForeignKey(Group,related_name = profile)
    #more attributes

如果我有Group(group)的实例,则可以使用:

group.profile.all()

而且:

Profile.objects.filter(group=group)

有什么区别,哪个更有效? 我试图在Google上找到但无法获得良好的解决方案。

如果我使用反向关系三到四次来查找元素怎么办?

2 个答案:

答案 0 :(得分:1)

从数据库的角度来看,两个查询都是相同的。您可以使用queryset的query属性来检查由ORM生成的SQL查询:

print(group.profile.all().query)
print(Profile.objects.filter(group=group))

结果:

  

选择“组”。“ id”,...从“组”中选择“组”。“ user_id” = {user_id}   ORDER BY“ group”。“ id” DESC

答案 1 :(得分:0)

所有两种语法与数据库视图相同。

但是在某些地方,第一种语法可用,第二种语法不可用。

例如,当渲染模板时,在模板中只有组变量,您可以像这样打印所有配置文件:

{% for profile in group.profile.all %}
    {# do anything with profile #}
{% endear %}

但是在模板中您不能使用第一种语法

,使用第一种语法,您可以执行更多查询,但不能使用第一种语法。例如,如果您有两组来提取配置文件,则第一种语法不起作用。