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