【问题标题】:How to make a query based in a FK?如何基于 FK 进行查询?
【发布时间】:2018-09-01 17:48:19
【问题描述】:

我有两个模型。在我的视图中,我想要返回 Model1 到 Model2 的引用,过滤用户记录的 ModelTwo 属性。这是我的models.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 的 PK 归因于 ModelOne。

我试过这个,但 PK 得到的是 ModelTwo,我想要 ModelOne 的 PK:

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

我看到'__'(underscore, underscore) 查询另一个类(FK),但我没有成功。另一件事是related_name,可以用它制作一个表格,使用起来很有趣。

谁能帮帮我?非常感谢朋友们的关注。

【问题讨论】:

  • 等等你想返回什么?您是要附加用户还是附加 model_ones?
  • 我尝试返回对象,ModelTwo 与 ModelOne 具有相同的对象。就像 name="Duck" ModelOne 的对象一样,我希望 ModelTwo 中的所有对象都具有与 ModelOne(name="Duck) 相同的对象。

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


【解决方案1】:

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

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

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

您可以在模型定义中使用related_name 来替换默认值。

【讨论】:

  • 我正在使用 generic.CreateView,尝试了这个并没有用,名称“user”没有定义。
  • user 应该包含您要为其查找对象的用户
【解决方案2】:

基本上你有几个选择:

如果您只需要ModelOne PK,那么:

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

我使用set 删除重复项。

另一个选项 - 使用适当的用户获取与 ModelTwo 相关的 ModelOnes。我觉得这样更好:

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

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2011-12-03
    • 2019-08-21
    • 1970-01-01
    • 2018-04-16
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多