Django 通过反向关系与过滤器函数查找元素



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

例如,模型包括:

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

如果我有组(group(的实例,那么我可以使用:

group.profile.all()

而且:

Profile.objects.filter(group=group)

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

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

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

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

结果:

选择"组"。id", ...从"组"到"组"。user_id" = {user_id} 按"组"排序。id" DESC

这两种语法都与数据库视图相同。

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

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

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

但是在模板中你不能使用第一个语法

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

相关内容

  • 没有找到相关文章

最新更新