数据库
首页 > 数据库> > mysql-Django将AND和OR查询与ManyToMany字段组​​合

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