mysql-Django将AND和OR查询与ManyToMany字段组合
作者:互联网
希望有人可以帮我这个忙.
我试图弄清楚是否可以构造一个查询,该查询将允许我同时基于ForeignKey字段和ManyToManyField从数据库中检索项目.最具挑战性的部分是它将需要对多个ManyToMany对象进行过滤.
希望有一个例子可以使这一点更加清楚.这是我的(简化的)模型:
class Item(models.Model):
name = models.CharField(max_length=200)
brand = models.ForeignKey(User, related_name='brand')
tags = models.ManyToManyField(Tag, blank=True, null=True)
def __unicode__(self):
return self.name
class Meta:
ordering = ['-id']
class Tag(models.Model):
name = models.CharField(max_length=64, unique=True)
def __unicode__(self):
return self.name
我想建立一个基于两个条件检索项目的查询:
>用户关注的用户上传的项目(在模型中称为“品牌”).因此,例如,如果某个用户正在关注最重要的用户帐户,则我希望所有品牌=最重要的项目.
>与已保存搜索中的关键字匹配的项目.例如,用户可以进行并保存以下搜索:“ 80年代喜剧”.在这种情况下,我希望标签包含“ 80s”和“喜剧”的所有项目.
现在,我知道如何为每个独立构造查询.对于#1,它是:
items = Item.objects.filter(brand=brand)
对于#2(基于文档):
items = Item.objects.filter(tags__name='80s').filter(tags__name='comedy')
我的问题是:是否可以将其构造为单个查询,这样我就不必承担将每个查询转换为列表,加入它们并删除重复项的麻烦了?
面临的挑战似乎是,无法使用Q对象构造查询,而您需要一个项目的manytomany字段(在本例中为标签)来匹配多个值.以下查询:
items = Item.objects.filter(Q(tags__name='80s') & Q(tags__name='comedy'))
不起作用.
(请参阅:https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships)
在此先感谢您的帮助!
解决方法:
经过大量研究,我找不到将其组合为单个查询的方法,因此最终我将QuerySet转换为列表并将其组合.
标签:mysql,django,many-to-many,django-queryset 来源: https://codeday.me/bug/20191010/1883494.html