2013-12-23 73 views
2

我有3種型號: models.py:Django的瀏覽限制子查詢

class Person(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

class Musician(models.Model): 
    person = models.ForeignKey(Person) 
    instrument = models.CharField(max_length=100) 

class Album(models.Model): 
    artist = models.ForeignKey(Musician) 
    name = models.CharField(max_length=100) 
    release_date = models.DateField() 
    num_stars = models.IntegerField() 

我試圖建立一種觀點認爲會: 顯示與他們的專輯不包括額定電壓與1星級這些專輯的所有人員。 views.py:

inner_qs = Musician.objects.filter(Album__num_stars__exact=1).values_list('person', flat=True).distinct() 
person_list = Person.objects.exclude(Musician__Album__id__in=inner_qs).distinct() 

查詢跳投不包括可能曾與1星專輯中的所有藝術家。 我需要的東西,在SQL是這樣的:

SELECT p.first_name, p.last_name,m.instrument, m.name, m.num_stars 
    FROM Person p 
    INNER JOIN Musician m ON m.person = p.id 
    INNER JOIN Album a ON a.artist = m.id 
     WHERE m.num_stars <> 1 

我知道視圖是在人職不包括,但¿我如何進一步排除元素融入到DB模式?

謝謝!

回答

2

如果你需要從鏈接對象的所有字段中的數據(結果SQL將類似於你的需要):

Album.objects.filter(~Q(num_stars=1)).select_related() 

而且,只有人的數據:

Person.objects.filter(~Q(musician__album__num_stars=1)) 
1
Person.objects.filter(Musician__Album__num_stars__exact=1).values_list('person', flat=True).distinct() 

結果的SQL相同的結果:

SELECT DISTINCT p.first_name, p.last_name,m.instrument, m.name, m.num_stars 
    FROM Person p 
    INNER JOIN Musician m ON m.person = p.id 
    INNER JOIN Album a ON a.artist = m.id 
    WHERE m.num_stars <> 1 
+1

結果不包含mi nstrument,m.name,m.num_stars,僅限個人數據:SELECT DISTINCT p.first_name,p.last_name FROM ... – ndpu