2011-09-09 60 views
1

考慮以下型號:Django模型'值()和LEFT OUTER JOIN

class Product(models.Model): 
    name = models.CharField(max_length=100, blank=False, null=False) 

class Provider(models.Model): 
    name = models.CharField(max_length=100, blank=False, null=False) 
    product = models.ForeignKey(Product) 

class Customer(models.Model): 
    name = models.CharField(max_length=100, blank=False, null=False) 
    product = models.ForeignKey(Product) 

當我執行類似的查詢:

Product.objects.values('name', 'provider__name', 'customer__name') 

生成的SQL使用LEFT OUTER JOIN代替內部聯接。使用filter時使用INNER JOIN。如何使用values()並避免由LEFT OUTER連接引起的不必要的NULL字段過濾?

爲什麼filter()/values()函數的行爲有差異?

+0

如果使用Product.objects.all()。select_related()會怎麼樣? – fabrizioM

+0

不幸的是,'select_related()'不包括反向關係 – Xyand

回答

1

,你可以像這樣的數值後使用過濾器:

Product.objects.values('name', 'provider__name', 'customer__name').filter(provider__name__isnull=False) 

我不是100%肯定,但不妨一試!讓我知道!

+0

它的確有用。然而,由此產生的查詢似乎不是很有效。它使用LEFT OUTER JOIN,然後使用WHERE子句來篩選結果,而不是INNER JOIN。我知道這個解決方案,但我希望有一個更好的解決方案。順便說一句,'provider__name__isnull = False'在我的情況。 – Xyand