我目前正在研究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 %}
但是在模板中你不能使用第一个语法
在第一个语法中,您可以执行更多查询,但不能在第一个语法中执行。 例如,如果您有两个组要提取配置文件,则第一个语法不起作用。