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

时间:2017-06-05 11:11:08

标签: django many-to-many django-queryset annotate

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

创建表(html)的想法如下:

/组/ 1:

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

/组/ 2:

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

4 个答案:

答案 0 :(得分:0)

根据我的理解,您希望从您的manytomany字段到模型进行反向查找。

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

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

product.group_set.all()

答案 1 :(得分:0)

值采用另一个名为&#39; group&#39;用它来获取相关组。没有给出你想要的期望结果。但是提出想法。

>>> 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'}]>

答案 2 :(得分:0)

获得Product个实例后:

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

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

groups = product.group_set.all()

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

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

答案 3 :(得分:0)

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() %} # ()

感谢所有人!