如何基于FK进行查询?

时间:2018-09-01 17:48:19

标签: django django-models django-views django-queryset

我有两个模型。在我的视图中,我想返回对Model2的引用Model1,过滤记录的用户归因于ModelTwo。这是我的模型。py

ModelOne(models.Model):
name = models.CharField(max_length=64, unique=True)
description = models.TextField()

ModelTwo(models.Model):
model_one = models.ForeignKey(ModelOne, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

在我看来,我希望结果使用户将ModelTwo归因于ModelOne获得PK。

我对此进行了尝试,但是PK正在获得ModelTwo,并且我希望PK用于ModelOne:

def get_queryset(self):
    return ModelTwo.objects.filter(user=self.request.user)

我看到'__'(下划线,下划线)对另一个类(FK)进行查询,但我没有这样做。另一件事是related_name,具有与此相关的形式,使用起来很有趣。

有人可以帮助我吗?非常感谢您对我朋友的关注。

2 个答案:

答案 0 :(得分:0)

好的,请记住,ForeignKey是一对多的关系。可以有多个ModelTwo记录连接到同一用户。要获取用户的所有ModelTwo记录,您可以执行ModelTwo.objects.filter(user=self.request.user)或使用默认的相关名称user.modeltwo_set.all()

要获得所有ModelOne,您可以使用类似的

ModelOne.objects.filter(id__in=user.modeltwo_set.values_list('pk'
, flat=True))

并且您可以在模型定义中使用related_name替换默认名称。

答案 1 :(得分:0)

基本上,您有几种选择:

如果您只需要ModelOne个PK,则:

set(ModelTwo.objects.filter(user=self.request.user).values_list('model_one__pk', flat=True))

我用set删除了重复项。

另一个选项-使用适当的用户获取与ModelOne有关系的ModelTwo。我认为这样比较好:

ModelOne.objects.filter(model_two_set__user=self.request.user).values_list('pk', flat=True)