Django - 带有 Single True 的布尔字段

ang*_*tis 5 python database django django-models

我想要一个布尔字段,仅允许其中一个基于外键(User )为True。我现在知道如何表达它或真正搜索它,但我能够得到一个简单的实现,但我不喜欢它。感觉很笨拙而且错误。无论如何,理解我的意思的最好方法就是你看到它,在这里:

class MyModel(models.Model):
    owner = models.ForeignKey(User)
    _is_main = models.BooleanField(default=False)

    def __get_is_main(self):
        return self._is_main

    def __set_is_main(self, is_main):
        if (is_main):
            active_keys = API_Key.objects.filter(_is_main=True, owner=self.owner)
            if (len(active_keys) == 1 and self in active_keys):
                return
            else:
                for key in active_keys:
                    if (key.is_main):
                        key.is_main = False
                        key.save()
        self._is_main = is_main
        self.save()

    is_main = property(__get_is_main, __set_is_main)
Run Code Online (Sandbox Code Playgroud)

我只希望每个所有者的is_main 为True一次,最多一次。这些用于 API 密钥。因此,所有者可以拥有多个 API 密钥,但只能将一个设置为主密钥。这是我能弄清楚如何实现这一点的唯一方法。有人有更好的方法来做到这一点吗?如果有必要的话我正在使用MySQL。

Dmi*_*hin 1

也许您不需要该字段,但有一个指向主键的单例。沿着这些思路:

class Key(models.Model):
    owner = models.ForeignKey(User)

    @property
    def is_main(self):
        return hasattr(self, 'is_main')

    def set_main(self):
        # update MainKey instance here


class MainKey(models.Model):
    key = models.ForeignKey(Key, related_name='is_main')

    def save(self, *args, **kwargs):
        self.id = 1
        super(MainKey, self).save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        pass
Run Code Online (Sandbox Code Playgroud)