1

我的模型如下:我有一組Dude s,並且每個Dude都有一組偏好。我可以根據他們的偏好很容易地找到Dude,但我需要找到那些更喜歡兩種不同的東西。我試圖將兩個Q對象傳遞給filter()函數,但在生成的SQL中這兩個對象引用了相同的相關Preference。我想讓他們參考兩種不同的Preferences。更糟糕的是,我需要查詢相關模型的幾個屬性(= Preference),所以我不能使用簡單的__inDjango:相關模型的多個實例上的filter()

型號:

class Dude(models.Model): 
    name = models.CharField(max_length=200) 

class Preference(models.Model): 
    name =  models.CharField(max_length=200) 
    how_much = models.CharField(max_length=200) 
    dude =  models.ForeignKey(Dude) 

測試用例:

class DudesTestCase(TestCase): 
    def setUp(self): 
     dude = Dude.objects.create(name = 'Dude') 
     cheese = Preference.objects.create(name = 'Cheese', how_much = "very", dude = dude) 
     bacon = Preference.objects.create(name = 'Bacon', how_much = "absolutely_love", dude = dude) 

    # does work 
    def test_cheese_lovers(self): 
     d = Dude.objects.filter(preference__name = 'Cheese', how_much = "very") 
     self.assertEquals(d[0].name, 'Dude') 

    # does not work - wants a single Preference to be both cheese and bacon 
    def test_cheese_and_bacon_lovers(self): 
     d = Dude.objects.filter(
       Q(preference__name = 'Cheese', how_much = "very"), 
       Q(preference__name = 'Bacon', how_much = "absolutely_love"), 
     ) 
     self.assertEquals(d[0].name, 'Dude') 

澄清: 我不希望找帥哥喜歡或者奶酪或臘肉,我需要人同時滿足兩個條件。

回答

0

添加相關的名稱型號:

class Preference(models.Model): 
    name = models.CharField(max_length=200) 
    dude = models.ForeignKey(Dude, related_name='preferences') 

而且使用INannotate

Dude.objects.filter(preferences__name__in=['Cheese', 'Bacon']) \ 
    .annotate(cnt=Count('preferences__name') \ 
    .filter(cnt=2) 
相關問題