gpt4 book ai didi

python - django 中的复杂 ORM 查询

转载 作者:行者123 更新时间:2023-11-28 22:18:03 25 4
gpt4 key购买 nike

这是我的用户

class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True, max_length=255)
mobile = PhoneNumberField(null=True)
username = models.CharField(null=False, unique=True, max_length=255)
full_name = models.CharField(max_length=255, blank=True, null=True)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)

这是我的测验模型,

class Quiz(Base):
category = models.ForeignKey(Category, related_name='quizzes', on_delete=models.CASCADE)
winners = models.ManyToManyField(User, related_name='quizzes_won')
losers = models.ManyToManyField(User, related_name='quizzes_lost')

我想查询一个用户没有玩过的所有小测验,因此赢家和输家不包含用户id。我该怎么做呢。对不起,我是 django 的新手。

最佳答案

我们可以在这里使用 .exclude(..) 作为标准 Userwinnerslosers 关系。所以:

from django.db.models import <b>Q</b>

Quiz.objects<b>.exclude(Q(winners=user) | Q(losers=user))</b>

在这里Q [doc]是封装了某个谓词的对象。通过使用“或”运算符 |,我们因此指定 winners 包含 userloser 包含 用户。因此,我们排除了满足至少一个(或两个)这些标准的测验

这会导致查询中的 MySQL 后端如下:

SELECT `quiz`.*
FROM `quiz`
WHERE NOT (
( `quiz`.`id` IN (SELECT U1.`quiz_id` AS Col1
FROM `quiz_winners` U1
WHERE U1.`user_id` = 123)
OR `quiz`.`id` IN (SELECT U1.`quiz_id` AS Col1
FROM `quiz_losers` U1
WHERE U1.`user_id` = 123)
)
)

(其中 123 实际上是 userid)

关于python - django 中的复杂 ORM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50788123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com