Django中的复杂ORM查询

梅丽莎·斯图尔特(Melissa Stewart)

这是我的用户

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 Q

Quiz.objects.exclude(Q(winners=user) | Q(losers=user))

这里Q[doc]是封装了特定谓词的对象。因此,通过使用“或”运算符,|我们可以将条件指定为winners包含userloser包含user因此Quiz我们排除满足这些条件中至少一个(或两个)的ze。

这样会在查询中产生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实际上id是的user

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章