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))
Не нужно считать то, чем вы не пользуетесь.