Как запросить все объекты модели, кроме тех, которые уже есть в другой модели?
Я работаю над приложением Django. У меня есть 2 модели, относящиеся к вопросу:
class Quiz(models.Model):
"""
Represents a Quiz for a `Module`.
It will have a `name`
"""
name = models.CharField(max_length=200)
user = models.ManyToManyField('cme.Bussines', related_name='quizes', through='UserQuiz', through_fields=('quiz', 'user'))
def __str__(self) -> str:
return f'{self.name}'
class Trio(models.Model):
"""
Represents the content for a Module.
Each `Trio` will have, as it's name says, 3 content fields, plus the
`Module` it belongs to.
It will have a `file`, a `video` (which will be a URL to a YT video), and a `quiz`
(which will be key to `Quiz`)
"""
file = models.FileField(upload_to='legacy/classes/', max_length=254)
quiz = models.ForeignKey(Quiz, on_delete=models.SET_NULL, related_name='trios', null=True, blank=True)
video = models.URLField()
module = models.ForeignKey(Module, on_delete=models.CASCADE, related_name='trios')
user = models.ManyToManyField('cme.Bussines', related_name='trios', through='UserTrio', through_fields=('trio', 'user'))
def __str__(self) -> str:
return f'Trio {self.id} de {self.module}'
Я хочу запросить все Quiz
зы, которых нет в quiz
поле Trio
. Есть ли способ сделать это?
Да, вы можете сделать запрос с помощью:
Quiz.objects.filter(trios=None)
Это сделает LEFT OUTER JOIN и сохранит только Quiz
зы, для которых нет связанных Trio
объектов.
Вы можете запросить все Quiz
объекты, чей id
виден в любом Trio
объекте :
Quiz.objects.exclude(id__in=Trio.objects.values("quiz_id"))
Вы также можете уточнить запрос. Например, допустим, вам нужны все Quiz
объекты, на которые не ссылается определенное подмножество объектов Trio
, вы можете сделать это, добавив фильтр в выражение exclude, что-то вроде :
Quiz.objects.exclude(id__in=Trio.objects.filter(...).values("quiz_id"))