Как запросить все объекты модели, кроме тех, которые уже есть в другой модели?

Я работаю над приложением 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"))
Вернуться на верх