我如何知道每个产品属于哪个组?

How do I know which groups each product is in?

class Product(models.Model):
    name = models.CharField(max_length=256)

class Group(models.Model):
    name = models.CharField(max_length=32, unique=False)   
    products = models.ManyToManyField(Product, blank=True)

group.pk 中的产品 == 1:

products = Group.objects.get(pk=1).products.all().values('name')

结果:

<QuerySet [
    {"name": "product1"},
    {"name": "product2"},
    {"name": "product3"},
]

我如何知道每个产品属于哪个组?像这样:

<QuerySet [
    {"name": "product1", "groups": [{"pk": 1, "name": "group1"}]},
    {"name": "product2", "groups": []"},
    {"name": "product3", "groups": [{"pk": 1, "name": "group1"}, {"pk": 2, "name": "group2"}},
]

谢谢!

UPD1.

如果我们有数据:

group1 | product 1
group1 | product 2
group2 | product 2
group2 | product 3

创建一个table(html)的思路如下:

/group/1:

product 1 | dropdown (group1)
product 2 | dropdown (group1, group2)

/group/2:

product 2 | dropdown (group1, group2)
product 3 | dropdown (group2)

据我了解,您想从 manytomany 字段到模型进行反向查找。

您可以获得这样的产品组:

此处 product 是一个 Product 对象,您想要列出与该产品关联的所有组。

product.group_set.all()

values 采用另一个名为 'group' 的参数,使用它来获取相关组。没有给出您想要的预期结果。但给出了想法。

>>> Product.objects.all().values('name', 'group')
<QuerySet [
    {'group': 1, 'name': u'Product 3'}, 
    {'group': 2, 'name': u'Product 3'}, 
    {'group': 1, 'name': u'Product 2'}, 
    {'group': 2, 'name': u'Product 1'}]>

一旦你有一个 Product 实例:

product = Product.objects.get(pk=1)

它知道哪些 Group 实例引用了它。使用 group_set 字段:

groups = product.group_set.all()

通过声明相关对象(使用 ForeignKeyManyToManyField),关系的“另一端”gets an implied field 可以访问引用此对象的实例。

在这种情况下,该字段名为 group_set,它是引用此 Product 个实例的 Group 个实例的模型管理器。

model.py:

context['products'] = Group.objects.get(pk=1).products.all()
return render(request, 'template.html', context)

template.html:

{% for product in products %}
    {{ product.name }}

    COUNT: {{ product.group_set.count }}
    <ul>
        {% for group in product.group_set.all %}
            <li>{{ group.name }}</li>
        {% endfor %}
    </ul>
{% endfor %}

解决方案并不困难,因为以下原因而感到困惑:

{% for group in slave_product.group_set.all() %} # ()

感谢大家!