Django 更改除一个以外的所有其他布尔字段

Django Change all other Boolean fields except one

我有一个模型,它有一个布尔字段:

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 的最简单方法是什么(主用户始终只有 1 个库)

我正在考虑查询所有库并更新每个库。也许还有另一种方法可以实现该功能?

如果您有 Library 主键 is_main 设置为 True,您可以使用:

from django.db.models import Q

Library.objects.filter(user=<em>my_user</em>).update(
    is_main=Q(pk=<em>my_pk</em>)
)

您可能还想在数据库级别强制执行 Libraryis_main=True per 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.<strong>UniqueConstraint(</strong>fields=('user',), condition=Q(is_main=True), name='one_main_per_user'<strong>)</strong>
        ]