django中的复杂ORM查询

时间:2018-06-10 21:18:12

标签: python django django-queryset

这是我的用户

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的新手。

2 个答案:

答案 0 :(得分:2)

您可以使用exclude

Quiz.objects.exclude(winners=my_user).exclude(losers=my_user)

答案 1 :(得分:2)

我们可以在此处使用User作为winnerslosersfrom django.db.models import Q Quiz.objects.exclude(Q(winners=user) | Q(losers=user))关系的标准。所以:

|

这里Q [doc]是一个封装了某个谓词的对象。使用"或"因此,运营商winners指定user包含loseruser包含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}}