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 и т.д. Это облегчит вам жизнь, а ваш код станет более читабельным.

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