我目前正在从事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上找到但无法获得良好的解决方案。
如果我使用反向关系三到四次来查找元素怎么办?
答案 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 %}
但是在模板中您不能使用第一种语法
,使用第一种语法,您可以执行更多查询,但不能使用第一种语法。例如,如果您有两组来提取配置文件,则第一种语法不起作用。