2017-04-17 58 views
0

我有自定義的用戶模型和兩種型號,都與ForeinKey兩個用戶同時:如何做複雜的加入在Django

class Feature1(models.Model): 
    user1 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='u1') 
    user2 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='u2') 

    some field.... 
    percentage = models.FloatField() 

class Feature2(models.Model): 
    user1 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='us1') 
    user2 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='us2') 

    some fields... 
    property = models.PositiveIntegerField() 

,然後我檢索與查詢集爲特定用戶的所有對

queryset = Feature1.objects.filter(u1=self.request.user).all().order_by('-percentage') 

,但我需要的,有從特點2模型這個查詢集數據量太大(對於每一個特定的對用戶,如果存在的話) 並從特徵2

是由「財產」能夠爲了查詢集

如何做到這一點?我研究過django文檔,但沒有結果。

+0

你看着使用'select_related()'? –

+0

可能就是這樣,但我不知道如何正確使用它。我的情況並不像django例子那麼簡單。 –

+0

您是否渴望'Feature2'中的所有字段,其中'Feature2'中的user1'等於'Feature1'中的'user1','Feature2'中的user2'等於'Feature1'中的'user2'? –

回答

1

一次嘗試將首先獲得所有user1suser2s從第一關係

u1 = Feature1.objects.all().values_list('user1', flat=True) 
u2 = Feature1.objects.all().values_list('user2', flat=True) 

,然後得到第二關係Feature2對象匹配那些用戶

queryset = Feature2.objects.filter(user1__in=u1, user2__in=u2).order_by('-percentage') 

我還想爲您的數據庫設計提供一種替代方案,我覺得它可以幫助您更有效地查詢模型。爲什麼不改變Feature2,使其具有ForeignKeyFeature1像這樣

class Feature2(models.Model): 
    feature1 = models.ForeignKey(Feature1, verbose_name="Feature 1") 

    ... 

然後,你可以將兩個這樣

queryset = Feature2.objects.filter(feature1__in=Feature1.objects.filter(u1=self.request.user)).order_by('-percentage') 
+0

這是一個嵌套的循環連接。任何方式更有效地做到這一點? – sudo

+0

就是這樣,但是一個查詢,我們有很多。我想用一個查詢來做到這一點(在我的情況下postgresql)。 –

+0

我必須回覆你。 @sudo,我確信有一種更有效的方式,但這是我從頭到尾想出來的。 –