Как разрешить булево True только для одной модели в таблице в Django?

У меня есть модель, в которой я хотел бы иметь возможность установить один параметр в качестве "приложения по умолчанию".

В этой модели я добавил поле с именем is_app_default для того, чтобы помочь учесть это.

class TreeLevel(models.Model):
    id = models.BigAutoField(primary_key=True)
    short_description = models.CharField(max_length=200)
    long_description = models.TextField()
    is_app_default = models.BooleanField(default=False)

    class Meta:
        verbose_name = "Tree Level"
        verbose_name_plural = "Tree Levels"

class Layer(models.Model):
    id = models.BigAutoField(primary_key=True)
    tree_levels = models.ManyToManyField(TreeLevel)
    description = models.TextField()

    class Meta:
        verbose_name = "Layer"
        verbose_name_plural = "Layers"

Модель Layer связана с TreeLevel с помощью m2m. В конечном итоге я хотел бы, чтобы is_app_default TreeLevel автоматически добавлялся к каждому отношению Layer m2m - вот почему может быть только один TreeLevel с is_app_default, установленным как True.

Мое потенциальное решение(я):

Пользователи с правами администратора могут создавать новые объекты TreeLevel - поэтому мне нужно убедиться, что они не устанавливают этот булев в новых моделях. Я думаю, что могу переопределить метод save() на TreeLevel, чтобы проверить БД, существует ли другой объект с этим булевым значением True - если да? Не сохранять "новый" и возвращать ошибку. Но я думаю, что это бьет по базе данных - потенциально вызывая ненужные запросы?

Тогда дополнительно мне нужно будет переопределить метод save() на Layer и добавить "по умолчанию" TreeLevel к этому many2many в то время.

Есть ли хороший способ "автоматически" справиться с этим с помощью этих отношений?

Моя конечная цель:

Иметь по умолчанию TreeLevel, который автоматически добавляется к каждому отношению Layer "многие ко многим", когда создается Layer.

Вопросы:

Будет ли предложенное мной решение работать?

Я пробовал искать в Djangos Unique Constraints, но я думаю, что они больше на уровне строки, а не на уровне таблицы.

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