1

兩種不同的方法:https://docs.djangoproject.com/en/dev/topics/db/queries/Django的 - 下面基於此頁面上的例子反向關係

class Blog(models.Model): 
    name = models.CharField(max_length=100) 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 

我想找到博客名稱hello world所有條目。有兩種方法可以做到這一點。數據庫性能有什麼不同?他們中的一個是更好還是更受歡迎?

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

OR

Entry.objects.filter(blog__name='hello world') 
+0

Blog.objects.get(name ='hello world')可能會導致一個異常Blog.DoesNotExist – crazyzubr

+0

對,謝謝你的提示。 – Medorator

回答

2

第一種方法是兩個單獨的數據庫調用:一個用於查找Blog,第二個用於獲取Entry對象。但是,每個都是一個簡單的查詢,沒有JOIN。

第二種方法只有一個查詢,但通過JOIN找到與該slug相關的博客條目。

您使用哪種方法取決於您的使用情況。例如,如果您已經擁有博客,那麼直接調用entry_set會更好,因爲那只是一個簡單的查詢。而如果你知道博客ID,而不是slug,那麼最好做Entry.objects.filter(blog_id=my_blog_id),因爲那時你根本就沒有加入JOIN,所以再次進行一個簡單的查詢。

+0

謝謝,更新了我的答案以反映這兩種方法的效果。 – Medorator

0

我比他們這樣

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' 

此外,作爲@crazyzubr指出,Q1將引發異常,如果找不到對象或找到多個對象。