Джанго.Проверяйте «unique_together» только в том случае, если оба поля Model были предоставлены для вызовов создания и обновления - PullRequest
0 голосов
/ 30 ноября 2018

Мне нужно проверять 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.

1 Ответ

0 голосов
/ 30 ноября 2018

Для проверки Django Rest Framework вы можете использовать проверку self.instance, чтобы использовать различные потоки проверки для создания и изменения объекта;

def validate(self, data):
    if self.instance:
        # Modifiying an existing instance, run validations accordingly
    else:
        # Creading a new instance, run validations accordingly

Что касается сайта администратора, вы можете использовать Django.Структура ModelForm и их валидации для обеспечения валидации для сайта администратора.Вам нужно настроить свой сайт администратора для использования вашей пользовательской формы для MyModel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...