Ограничить количество записей в модели, которые могут иметь значение для пользователя

У меня есть модель с логическим полем с именем 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() - так что вполне возможно, что состояние гонки может возникнуть из-за уровня параллелизма со стороны работников сельдерея.

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?')
Другие вопросы по тегам