Django-遵循反向关系的两种不同方法

Django-遵循反向关系的两种不同方法,django,django-models,foreign-key-relationship,django-queryset,django-orm,Django,Django Models,Foreign Key Relationship,Django Queryset,Django Orm,根据本页上的示例: 我想找到所有博客名为hello world的条目。有两种方法可以做到这一点。在数据库性能方面有什么不同?其中一个更好/更受欢迎吗 b = Blog.objets.get(name='hello world') b.entry_set.all() 或 我这样比较他们 q1 = Blog.objects.get(name='hello world').entry_set.all() q2 = Entry.objects.filter(blog__name='hello worl

根据本页上的示例:

我想找到所有博客名为
hello world
的条目。有两种方法可以做到这一点。在数据库性能方面有什么不同?其中一个更好/更受欢迎吗

b = Blog.objets.get(name='hello world')
b.entry_set.all()


我这样比较他们

q1 = Blog.objects.get(name='hello world').entry_set.all()
q2 = Entry.objects.filter(blog__name='hello world')

print q1.query
SELECT `entry`.`id`, `entry`.`blog_id` FROM `entry` WHERE `entry`.`blog_id` = 1

print q2.query
SELECT `entry`.`id`, `entry`.`blog_id` FROM `entry` INNER JOIN `blog` ON ( `entry`.`blog_id` = `blog`.`id` ) WHERE `blog`.`name` = 'hello world'

此外,正如@Crazzubr指出的,如果未找到对象或找到多个对象,q1将引发异常。

第一种方法是两个单独的数据库调用:一个用于查找博客,另一个用于获取条目对象。但是,每个查询都是一个没有连接的简单查询

第二种方法只是一个查询,但会进行连接以查找与带有该slug的blog相关的条目


您使用哪种方法取决于您的用例。例如,如果你已经有了博客,那么直接在博客上调用
entry\u set
会更好,因为这只是一个简单的查询。然而,如果您知道blog ID,而不是slug,那么最好执行
Entry.objects.filter(blog\u ID=my\u blog\u ID)
,因为这样您就根本没有进行连接,所以再次执行一个简单的查询。

blog.objects.get(name='hello world')可能会导致异常blog.DoesNotExistRight,感谢您的提示。谢谢,更新了我的答案,以反映这两种方法的效果。
Entry.objects.filter(blog__name='hello world')
q1 = Blog.objects.get(name='hello world').entry_set.all()
q2 = Entry.objects.filter(blog__name='hello world')

print q1.query
SELECT `entry`.`id`, `entry`.`blog_id` FROM `entry` WHERE `entry`.`blog_id` = 1

print q2.query
SELECT `entry`.`id`, `entry`.`blog_id` FROM `entry` INNER JOIN `blog` ON ( `entry`.`blog_id` = `blog`.`id` ) WHERE `blog`.`name` = 'hello world'