来自 ForeignKey 的 django 反向关系查询

Posted

技术标签:

【中文标题】来自 ForeignKey 的 django 反向关系查询【英文标题】:django reverse relation query from ForeignKey 【发布时间】:2022-01-22 02:00:22 【问题描述】:

假设我定义了几个简单的模型:

class Pizza(models.Model):
    name = models.CharField()
    # Get the name of topping here
    ...

class Topping(models.Model):
    pizza = models.ForeignKey(Pizza)

我可以做的一件事是查询Topping,然后访问Pizza。但这不是我想要的。我想做一个反向关系查询。我想在Pizza 中获取Topping,如果存在这样的Topping,可能会有一些Pizza 没有Topping。使用djangodrf

我怎样才能做到这一点?

我什至尝试过:

Pizza.objects.filter()
.prefetch_related("topping_set")

我们不喜欢菠萝披萨

【问题讨论】:

如果你要在pizza中只添加一个topping,你可以使用foreignkey字段,否则如果pizza可以有多个topping,那么你必须使用manytomany字段。使用每个浇头的详细信息创建浇头模型。创建一个带有 manytomany 字段的 Pizza 模型。因此,每个比萨可以有多个浇头,您可以获得比萨中使用的浇头实例列表,还可以获得使用任何特定浇头的比萨列表。请参阅以下链接以了解多对多字段。 docs.djangoproject.com/en/4.0/topics/db/examples/many_to_many 这能回答你的问题吗? 'ReverseManyToOneDescriptor' object has no attribute 'all' 我不确定我是否理解您要执行的操作。您想从某些比萨中获取配料,还是根据配料过滤比萨?你能给我们一个比我们不喜欢菠萝披萨更具体的例子吗? 【参考方案1】:

你确定你没有像this example那样使用many-to-many吗? 如果不是这种情况,并且您在 Topping 中有一个 ForeignKey,您可以执行以下操作:

pizzas_with_pineapple = Pizza.objects.filter(pk__in=Topping.objects.filter(name='pineapple').values_list('pizza'))

pizzas_without_pineapple = Pizza.objects.exclude(pk__in=Topping.objects.filter(name='pineapple').values_list('pizza'))

AFAIK,如果不请求浇头,就无法解析比萨饼。

【讨论】:

以上是关于来自 ForeignKey 的 django 反向关系查询的主要内容,如果未能解决你的问题,请参考以下文章

Django CheckConstraint:反向ForeignKey查找的元素不能为空

如何在 DJango 管理界面中显示 ForeignKey 反向查找列表?

Django之跨表查询——正反向查询(ForeignKey)

Django 反向关系

在 Django 模板中过滤反向查找

Django orm的正向反向操作