【问题标题】:django: prevent UniqueTogetherValidator on Serializerdjango:防止序列化器上的 UniqueTogetherValidator
【发布时间】:2016-09-08 01:56:39
【问题描述】:

我在使用 django 时遇到问题。我用一些字段创建了我的模型:

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 在序列化程序上使用?

【问题讨论】:

  • 此错误适用于您发送的所有数据还是仅适用于一组数据?它看起来更像是数据没有遵守唯一约束。更重要的是,unique_together = ('field1', 'field2') 应该看起来像这样,没有双括号
  • 我正在发送一个包含 6-24 个对象的列表,并且我得到每个对象的错误。当我从数据库中删除具有这些属性的先前对象时,请求成功。我尝试删除双括号,错误仍然存​​在
  • 每次完成请求时,如果您打算再次将完全相同的数据用于另一个请求,则需要运行python manage.py flush 来清理数据库。否则,您将违反唯一的约束。
  • @MosesKoledoye 我不明白。但是,我正在从在线界面更新对象,我只需要在序列化程序之后获取它们,这样我就可以使用get_or_create 来更新/创建它们,但我从来没有达到它,因为序列化程序使用@987654329 @...
  • 尝试serializer.is_valid(raise_exception=False) 如看到here

标签: python django api django-validation


【解决方案1】:

这是基于djangorestframework==3.8.2。 覆盖ModelSerializer 上的get_validators 方法,并注释掉获取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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 2012-01-24
    • 2014-06-06
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多