过滤精确使用many_to_many字段django模型

时间:2017-11-29 15:05:25

标签: python django postgresql django-models

我将此定义纳入models.py

class Group(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    products = models.ManyToManyField(Product, through='ProdGroup')

class ProdGroup(models.Model):
    groups= models.ForeignKey(Group, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    is_prd_main = models.BooleanField(default=False)

class Product(models.Model):
    id = models.CharField(primary_key=True, default='', max_length=12)

我想检查一下我的数据库中是否已经有一个具有相同产品的组,不多,而不是。 (还要检查prd_main是否相同)。

我不知道through选项是否存在问题,但这不起作用:

group = Group.objects.all()[0] # an instance already in the db
Group.objects.filter(products__exact=group.products)
<QuerySet []>

编辑: 我也尝试使用:

Group.objects.filter(products__in=group.products.all()) # it works, but it returns also groups that partialy have the products in group
Group.objects.filter(products__exact=group.products.all()) #ERORR: more than one row returned by a subquery used as an expression

它有一种方法,给定一个对象group来检查它已经在数据库中?,它有一种方法来获取所有products并过滤所有具有相同唯一集合的组products

1 个答案:

答案 0 :(得分:0)

所以你用这一行获取一个条目:

group = Group.objects.all()[0]

现在,如果你想获得group的产品,你必须这样做:

group.products.all()

如果你这样做:

group.products

您只会获得ManyRelatedManager的实例。

尝试更改过滤器查询:

Group.objects.filter(products__exact=group.products.all())

它应该完成这项工作。

编辑:

您可以进一步增强查询并排除用作搜索引用的组:

Group.objects.filter(products__exact=group.products.all()).exclude(id=group.id)

更新:

通常当我查询many2many关系时,我会使用id列表。在这种情况下,可以这样做:

group = Group.objects.all()[0]
# or maybe better
group = Group.objects.all().first()
product_ids = list(group.products.all().values_list('id', flat=True))
Group.objects.filter(products__exact=product_ids)

虽然我不确定这是否会改变任何事情。