我有一个名为is_active
的布尔字段的模型。我想限制user
可以具有的模型数,其中该布尔字段的值为True
为1。
class MyModel(models.Model):
user = models.ForeignKey(User)
is_active = models.BooleanField(default=False)
#...more fields ...
最初我只是要向unique_togeather = ("user", "is_active")
添加Meta
条目 - 但当然这也会限制False
条目User
可以拥有的条目数 - - 我需要无限制。
理想情况下,我想在数据库级别解决这个问题,以防止竞争条件。
模型是由Celery任务使用MyModel.objects.get_or_create()
导入数据创建的 - 因此很可能由于Celery工作人员的并发级别而出现竞争条件。
答案 0 :(得分:2)
您应该在模型上创建自定义清理方法。
from django.core.exceptions import ValidationError
from django.db import models
class MyModel(models.Model):
user = models.ForeignKey(User)
is_active = models.BooleanField(default=False)
#...more fields ...
def clean(self):
if not self.pk and MyModel.objects.filter(user=self.user, is_active=True).exists():
raise ValidationError('How about no?')