Как разрешить булево 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, но я думаю, что они больше на уровне строки, а не на уровне таблицы.