我将此定义纳入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
?
答案 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)
虽然我不确定这是否会改变任何事情。