У меня небольшая прямая проблема. Тем не менее, мне трудно ее решить.
У меня есть одна упрощенная модель:
class Post(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
creation_date_time = models.DateTimeField(auto_now_add=True)
is_published = models.BooleanField(default=False)
title = models.CharField(max_length=255, blank=True, null=True)
def save(self, *args, **kwargs):
if not self.creation_date_time:
existing_post = \
self.author.post_set \
.filter(
is_published=False,
conversation=self.conversation) \
.exists()
if existing_post:
raise IndexError
super().save(*args, **kwargs)
Теперь я хочу проверить, что: У каждого автора может быть только один неопубликованная (черновик) публикация.
Текущий код проверяет это при создании экземпляра, но становится довольно сложным, когда экземпляр обновляется и не создается, например, через django admin.
Важно, однако, что можно обновлять свойства модели независимо от is_published
. Только создание двух или более сообщений с is_published=True
на пользователя должно вызвать ошибку.
Есть ли способ сделать это, чего я не вижу?
РЕДАКТИРОВАТЬ: Благодаря @ nigel222 я смог решить свою проблему. Вот моя реализация:
def save(self, *args, **kwargs):
if self.is_published == False:
existing_post_uuids = \
self.author.post_set \
.filter(
is_published=False,
conversation=self.conversation) \
.values_list('uuid', flat=True)
if len(existing_post_uuids) == 0 \
or existing_post_uuids[0] == self.uuid:
super().save(*args, **kwargs)
else:
raise ValidationError('Users can only have one draft per conversation')
super().save(*args, **kwargs)