【问题标题】:Django query for vendors who supply all partsDjango 查询提供所有零件的供应商
【发布时间】:2016-04-12 04:51:06
【问题描述】:

给定模型(供应商提供零件,多对多关系):

from django.db import models

class Part(models.Model):
    pass

class Vendor(models.Model):
    name = models.CharField(max_length=100)
    parts = models.ManyToManyField(Part)
    def __str__(self):
        return "%s" % self.name

是否可以编写一个 Django 查询来获取提供所有部件的供应商?我对将生成单个 SQL 语句的查询感兴趣。


例如,使用以下数据:

p1 = Part()
p2 = Part()
p3 = Part()
v1 = Vendor(name="supply nothing")
v2 = Vendor(name="supply some parts")
v3 = Vendor(name="supply all parts")
p1.save()
p2.save()
p3.save()
v1.save()
v2.save()
v3.save()
v2.parts.add(p1,p2)
v3.parts.add(p1,p2,p3)

我想得到:

[<Vendor: supply all parts>]

【问题讨论】:

标签: django django-models


【解决方案1】:

您可以先查询所有部分:

parts = Part.objects.all()

然后过滤供应商:

vendors = Vendor.objects.filter(parts=parts)

【讨论】:

  • Cannot resolve keyword 'part_set' into field. Choices are: id, name, parts。我明白了,但无论如何这将产生两个 SQL 查询,其中包含往返于数据库服务器的部件列表。我正在寻找一个单一的 SQL 语句解决方案。
  • @EgorRogov 您使用了related_name,这不在您的问题中。我已经编辑了我的答案。立即尝试
  • 不,没有相关名称。顺便说一句,更新版本也不起作用(more than one row returned by a subquery used as an expression)。
  • @EgorRogov 我这里有确切的结构,它正在工作,你的 Django 版本是什么?
  • 模型与描述的完全相同,我为这个问题准备了它们。数据库包含与描述完全相同的数据。没有别的了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多