Django Измените все остальные булевы поля, кроме одного
У меня есть модель, в которой есть поле boolean:
class Library(SocialLinksModelMixin):
"""
Represents book shelves and places where people have / leave books.
"""
user = models.ForeignKey(...)
is_main = models.BooleanField(default=False)
Пользователь может иметь несколько библиотек, и я хотел бы позволить установить главную из них, чтобы облегчить поток в приложении.
Какой самый простой способ переключить только одну библиотеку is_main в True, а все остальные в False (Для пользователя всегда есть только одна библиотека, которая является главной)
Я думаю о запросе всех библиотек и обновлении каждой из них. Может быть, есть другой способ сделать эту функциональность?
Если у вас есть главный ключ от Library для установки is_main на True, вы можете работать с:
from django.db.models import Q
Library.objects.filter(user=my_user).update(
is_main=Q(pk=my_pk)
)
Вы также можете захотеть обеспечить на уровне базы данных, что может быть только один Library с is_main=True на user:
from django.conf import settings
from django.db.models import Q
class Library(SocialLinksModelMixin):
"""
Represents book shelves and places where people have / leave books.
"""
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
is_main = models.BooleanField(default=False)
class Meta:
constraints = [
models.UniqueConstraint(fields=('user',), condition=Q(is_main=True), name='one_main_per_user')
]