Django проверяет, все ли объекты, ссылающиеся на объект, имеют определенный "флаг"?
Когда мне нужно проверить, что объект больше не упоминается, я могу использовать
class ModelA(models.Model):
pass
class ModelB(models.Model):
retired = models.BooleanField(default=False)
modelA = models.ForeignKey(
ModelA,
)
ModelA.objects.filter(~Q(modelb__isnull=False))
"Странный" формат использования отрицания и проверки на False позволяет создать оператор Exists вместо подзапроса или join.
Однако как мне проверить, что "МодельА используется только в экземплярах МоделиВ, которые имеют retired=True", или вообще не упоминаются.
первый шаг - использование related_name в поле ForeignKey.
class ModelB(models.Model):
retired = models.BooleanField(default=False)
modelA = models.ForeignKey(
ModelA,
related_name="modelb"
)
Второй шаг - использование нужных вещей в фильтрах
# if u need not-retired modelb
ModelA.objects.filter(modelb__isnull=False, modelb__retired=False)
# if u need retired or null-retired variant 1
ModelA.objects.filter(modelb__isnull=False, modelb__retired__in=(True, None))
# if u need retired or null-retired variant 2
ModelA.objects.filter(modelb__isnull=False).exclude(modelb__retired=False)
# if u need to keep your weird format
ModelA.objects.filter(modelb__retired=False, ~Q(modelb__isnull=False))
Я предлагаю ВАМ, ЧИТАТЕЛЮ, всегда использовать related_name в ForeignKey, ManyToMany, OneToOne и т.д. Это облегчит вам жизнь, а ваш код станет более читабельным.