限制模型中可以具有每个用户值的记录数

时间:2014-02-06 03:43:32

标签: django postgresql django-models

我有一个名为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工作人员的并发级别而出现竞争条件。

1 个答案:

答案 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?')