来自 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
。使用django
和drf
我怎样才能做到这一点?
我什至尝试过:
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 反向查找列表?