django: запретить UniqueTogetherValidator в сериализаторе

У меня проблема с джанго. Я создал свою модель с некоторыми полями, например:

class MyModel(Model):
    field1 = models.IntegerField()
    field2 = models.CharField(max_length=200)
    field3 = models.IntegerField()

    class Meta:
        unique_together = (('field1', 'field2'))

И у меня есть маршрут API, который ссылается на сериализатор модели:

class MyModelSerializer(ModelSerializer):
    class Meta:
        model = models.MyModel

Проблема в том, что когда я отправляю объекты через API для их обновления, сериализатор поднимает {'non_field_errors': ['The fields field1, field2 must make a unique set.']}

Кто-нибудь знает, как предотвратить использование UniqueTogetherValidator в сериализаторе?


person Jo Colina    schedule 12.05.2016    source источник
comment
Эта ошибка применима ко всем данным, которые вы отправляете, или только к одному набору? Это больше похоже на то, что уникальное ограничение не соблюдается данными. Более того, unique_together = ('field1', 'field2') должно выглядеть так, без двойных скобок   -  person Moses Koledoye    schedule 12.05.2016
comment
Я отправляю список с 6-24 объектами и получаю ошибку для каждого из них. Когда я удаляю предыдущие объекты с этими свойствами из БД, запрос выполняется успешно. Я попытался удалить двойную скобку, ошибка остается   -  person Jo Colina    schedule 12.05.2016
comment
Каждый раз, когда вы выполняете запрос, вам нужно запускать python manage.py flush для очистки БД, если вы планируете снова использовать те же самые данные для другого запроса. В противном случае у вас будет уникальное нарушение ограничения.   -  person Moses Koledoye    schedule 12.05.2016
comment
@MosesKoledoye Я понимаю. Тем не менее, я обновляю объекты из онлайн-интерфейса, и все, что мне нужно, это получить их после сериализатора, поэтому я могу использовать get_or_create для их обновления/создания, но я никогда не достигаю этого, потому что сериализатор использует UniqueTogetherValidator...   -  person Jo Colina    schedule 12.05.2016
comment
Попробуйте serializer.is_valid(raise_exception=False), как показано здесь   -  person Moses Koledoye    schedule 12.05.2016
comment
Я действительно думал, что это сработает :( ха-ха, но это не так... Если я найду, как это сделать, я опубликую ответ здесь   -  person Jo Colina    schedule 12.05.2016


Ответы (1)


Это основано на djangorestframework==3.8.2. Переопределите метод get_validators, который находится в ModelSerializer, и закомментируйте вызов для получения unique_together_validators, если это единственный валидатор, который вы действительно хотите исключить. В противном случае этот ответ https://stackoverflow.com/a/46022282/1658745 предлагает просто настроить валидаторы для пустого списка, чтобы отключить все проверки для этого сериализатора.

class MyModelSerializer(ModelSerializer):

    def get_validators(self):
        """
        Determine the set of validators to use when instantiating serializer.
        """
        # If the validators have been declared explicitly then use that.
        validators = getattr(getattr(self, 'Meta', None), 'validators', None)
        if validators is not None:
            return validators[:]

        # Otherwise use the default set of validators.
        return (
            # self.get_unique_together_validators() +
            self.get_unique_for_date_validators()
        )

    class Meta:
        model = models.MyModel
person Ralphie Aguayo    schedule 02.11.2018