这是我的用户
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的新手。
答案 0 :(得分:2)
您可以使用exclude
:
Quiz.objects.exclude(winners=my_user).exclude(losers=my_user)
答案 1 :(得分:2)
我们可以在此处使用User
作为winners
与losers
或from django.db.models import Q
Quiz.objects.exclude(Q(winners=user) | Q(losers=user))
关系的标准。所以:
|
这里Q
[doc]是一个封装了某个谓词的对象。使用"或"因此,运营商winners
指定user
包含loser
或user
包含Quiz
的条件。因此,我们排除满足这些标准中至少一个(或两个)的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)
)
)
个。
这会在查询中产生MySQL后端,如:
123
(其中id
实际上是user
的{{1}}