Мне нужно проверять unique_together
только в том случае, если оба поля были предоставлены администратору для создания Form
или через API
запрос для вызовов create
и update
.Если это происходит и поля не unique_together
, мне нужно распространить Exception
на django-admin
создание Form
и RestFramework
'Serializer/ViewSet
.
Вот упрощенный пример моей модели:
class MyModel(models.Model):
time = models.TimeField(null=True, blank=True)
date = models.DateField(null=True, blank=True)
some_other_field = models.BooleanField(default=False)
...
Как вы можете видеть на уровне модели, time
и date
не требуются и могут быть обнуляемыми.
Для логики приложения, с другой стороны, требуется по крайней мере один изте поля, которые должны быть предоставлены, и если предоставлены оба поля - эта пара должна быть уникальной для всей таблицы, чтобы избежать дублирования композиции datetime
.
Эта модель доступна через следующие узлы: django-admin
и DjangoRestFramework
'Конечная точка с использованием ViewSet
.
Создание новой записи не представляется проблемой с точки зрения API
, я могу переопределить validate
метод Serializer
:
def validate(self, data):
if not data.get('time') and not data.get('date'):
raise serializers.ValidationError(
"At least one of this fields is required: time, date"
)
if OpenTable.objects.filter(
time=data.get('time'),
date=data.get('date')).exists():
raise serializers.ValidationError('Duplicates for date or datetime not allowed')
return data
Но это становится проблемой, когда я получаю запрос PUT
или PATCH
, потому что тогда, несмотря на то, что эта запись является единственной в таблице, я поднимаю ValidationError
именно потому, что есть запись с этой парой date
- time
.
Переопределение validate
методтакже не решает проблему предотвращения создания такой пары из Django-Admin
.
. На данный момент, самое близкое к этому подтверждение - использование save
метода MyModel
, но я не могу понятькак именно обрабатывать этот случай, чтобы соблюдать поток create
/ update
.