2017-04-17 33 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,我确信有一种更有效的方式,但这是我从头到尾想出来的。 –