Q 对象和 '&' Django 中的运算符

发布于 2024-10-09 00:23:38 字数 714 浏览 1 评论 0原文

我有一个奇怪的问题。

我有3个对象。都是一样的

class Articles(models.Model):
    owner = models.ForeignKey(Author)
    tags = models.ManyToManyField('Tag')


class Tag(models.Model):
     name = models.CharField(max_length=255)

,所以我有 3 篇文章。具有所有相同的标签:“tag1”和“tag2”

并且我有疑问

actionsAll = Articles.objects.filter((Q(tags__name__exact="tag1") | Q(tags__name__exact="tag2"))).distinct()

这给了我所有的文章。它将返回 6 篇文章,不包含distinct(),因为它会收集每篇文章 2 倍,因为它们都有两个标签。

然而,对于这个查询:

actionsAll = Articles.objects.filter((Q(tags__name__exact="tag1") & Q(tags__name__exact="tag2"))).distinct()

这没有给我任何文章。 由于文章包含这两个标签,它应该返回所有标签,不是吗?

I have a curious problem.

I have 3 objects. All the same

class Articles(models.Model):
    owner = models.ForeignKey(Author)
    tags = models.ManyToManyField('Tag')


class Tag(models.Model):
     name = models.CharField(max_length=255)

and so I have 3 Articles. With all the same tags: 'tag1' and 'tag2'

And I have queries

actionsAll = Articles.objects.filter((Q(tags__name__exact="tag1") | Q(tags__name__exact="tag2"))).distinct()

This gives me all my articles. It will return 6 articles w/o distinct() since it will collect each article 2x since they have both tags.

However with this query:

actionsAll = Articles.objects.filter((Q(tags__name__exact="tag1") & Q(tags__name__exact="tag2"))).distinct()

This gives me no articles.
Since the articles contain both the tags, it should return them all shouldnt it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷…雨湿花 2024-10-16 00:23:38

如果您查看它生成的 SQL,您会发现它会检查相同标记是否具有两个名称。您需要的是 IN 查询EXISTS 遍历关系的查询。

If you look at the SQL it generates, you'll see that it checks to see if the same tag has both names. What you need is an IN query or an EXISTS query that traverses the relation.

不奢求什么 2024-10-16 00:23:38
** import Q from django
from *models import SuperUser, NameUser
import operator

# we do not know the name in the superhero
super_users = SuperUser.objects.all()
q_expressions = [Q(username=user.username) for user in super_users]
# we have bind super_hero with user
name_superheroes_qs = models.NameUser.objects.filter(reduce(operator.or_, q_expressions))
** import Q from django
from *models import SuperUser, NameUser
import operator

# we do not know the name in the superhero
super_users = SuperUser.objects.all()
q_expressions = [Q(username=user.username) for user in super_users]
# we have bind super_hero with user
name_superheroes_qs = models.NameUser.objects.filter(reduce(operator.or_, q_expressions))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文