Estoy trabajando en una aplicación Django. Tengo 2 modelos relevantes para la pregunta:
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}'
Quiero consultar todos los Quiz
que no están en el campo de quiz
de Trio
. ¿Hay alguna forma de hacer esto?
Sí, puedes consultar con:
Quiz.objects.filter( trios=None )
Esto hará una UNIÓN Quiz
IZQUIERDA y solo conservará las Pruebas para las que no hay un objeto Trio
relacionado.
Puede consultar todos los objetos Quiz
cuya id
se ve en cualquier objeto Trio
:
Quiz.objects.exclude(id__in=Trio.objects.values("quiz_id"))
También puede refinar más la consulta. Por ejemplo, supongamos que desea que todos los objetos Quiz
no se refieran a un subconjunto específico de objetos Trio
, puede hacerlo agregando un filtro en su expresión de exclusión, algo como:
Quiz.objects.exclude(id__in=Trio.objects.filter(...).values("quiz_id"))