Django queryset filter on whether related field is empty

вот мои модели:

class Flag(models.Model):
    ban = models.ForeignKey('flags.Ban', on_delete=models.CASCADE, related_name='flags')


class Ban(models.Model):
    punished = models.BooleanField(default=None)

Flag срабатывает, когда пользователь сообщает о каком-то контенте. и они суммируются в экземпляр Ban для проверки администратором. кратко говоря, бан может иметь много флагов.

есть один случай, когда автор, о котором сообщают, вручную удаляет контент, который он/она отправил/а, прежде чем админ придет туда. бан должен быть снят. поэтому. в просмотре списка банов, я пытаюсь отфильтровать их и удалить.

    to_deletes = []
    for ban in Ban.objects.all():
        if not len(ban.flags.all()):
            to_deletes.append(ban)
    for ban in to_deletes:
        ban.delete()

Интересно, есть ли способ записать это в queryset, все, что мне нужно, это Ban.objects.all(), который отклоняет пустые флаги для просмотра списка для производительности и элегантности.

Вы можете подсчитать экземпляры флагов в каждом экземпляре Ban, аннотировать его, а затем отфильтровать по этой аннотации, что-то вроде этого:

from django.db.models import Count
bans_to_delete = Ban.objects.all().annotate(count=Count('flags')).filter(count=0)

Если вы просто хотите проверить отсутствие флагов, вы можете использовать filter

bans_to_delete = (Ban
                  .objects
                  .filter(flags__isnull=True))

Не нужно считать то, чем вы не пользуетесь.

Вернуться на верх