【问题标题】:Limit the number of records in a Model that can have a value per user限制模型中每个用户可以具有值的记录数
【发布时间】:2014-02-06 03:43:32
【问题描述】:

我有一个模型,其中包含一个名为 is_active 的布尔字段。我想将 user 可以具有的模型数量限制为 1。

class MyModel(models.Model):
    user = models.ForeignKey(User)
    is_active = models.BooleanField(default=False)
    #...more fields ...

最初我只是想在Meta 中添加一个unique_togeather = ("user", "is_active") 条目——当然这也会限制User 可以拥有的False 条目的数量——我需要不受限制。

理想情况下,我想在数据库级别解决这个问题,以防止出现竞争条件。

模型是由使用MyModel.objects.get_or_create() 导入数据的 Celery 任务创建的——因此,由于 Celery 工作人员的并发水平,很可能会出现竞争条件。

【问题讨论】:

    标签: django postgresql django-models


    【解决方案1】:

    您应该在模型上创建自定义清理方法。

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

    【讨论】:

    • 是否还有添加某种类型的数据库约束(Postgres)?如果同时创建模型的两个实例,这种方法是否仍然容易受到竞争条件的影响?模型也是用 MyModel.objects.get_or_create() 创建的——所以我不相信在这种情况下会调用 clean() 方法。
    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2015-06-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多