如何在Django中进行复杂的连接

时间:2017-04-17 17:09:29

标签: python django python-3.x django-models django-queryset

我有自定义用户模型和两个模型,两个用户同时使用ForeinKey:

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

的特定用户的所有对
queryset = Feature1.objects.filter(u1=self.request.user).all().order_by('-percentage')

但我需要的是,来自Feature2模型的此查询集数据(对于每个特定的用户对,如果存在) 并且能够通过Feature2的“属性”命令查询集

怎么做?我研究了django docs,但没有结果。

1 个答案:

答案 0 :(得分: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')