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')
        ]
Вернуться на верх