【问题标题】:unique_together in a model.Models vs uniquetogethervalidator of serializers模型中的 unique_together.Models 与序列化程序的 uniquetogethervalidator
【发布时间】:2019-11-22 20:50:03
【问题描述】:

如果我有一个model A (field1 和 field2 是模型的字段)

`unique_together = ('field1', 'field2')`

Meta 类和serializer 中,这是serializermodel A 的模型,那么我为什么要或为什么不应该在序列化程序的Meta 中使用Uniquetogethervalidator。如果我们在模型中已经有了条件,为什么还需要这个验证器?或者在模型中使用 unique_constraint 和在序列化程序中使用 uniquetogethervalidator 有什么区别?

【问题讨论】:

    标签: python django django-models django-rest-framework unique


    【解决方案1】:

    如果我们在模型中已经有了条件,为什么还需要这个验证器?

    将所有验证保留在序列化程序上,而无需进入模型层;为了避免进行分区验证。

    DRF 验证遵循与 Django 不同的想法——Django 尝试在表单级别进行一些验证,并将其余部分委托给模型(例如 unique_together),而 DRF 尝试在序列化程序级别合并所有验证。

    在模型中使用 unique_constraint 和在序列化器中使用 uniquetogethervalidator 有什么区别?

    DRF 中的UniqueTogether 验证器在序列化器中实现,即在将数据传递到下一个级别(即模型)之前。此外,这个验证器是在纯 Python 中实现的,这就是为什么 queryset 参数对于 UniqueTogether 检查其中字段的唯一性是必需的。

    OTOH, unique_together 在模型中实现了一个数据库约束,该约束仅在将对象保存到 DB 时进行检查,并且此检查由 DB 本身完成/强制执行。

    另外,if you have unique_together constraints on the model and if you're using DRF ModelSerializer, then those constraints are converted to a UniqueTogetherValidator object by DRF 以便它可以在将数据传递到数据库之前进行验证。

    【讨论】:

    • 好的,谢谢。我明白了。但是因为我在uniquetogether validatorgithub.com/encode/django-rest-framework/issues/7003 中发现了一个错误,但我立即想在modelserializer 中使用这个uniquetogether validation,所以如果不满足这个唯一性,我可以获得相同的结果(或者基本相同的验证错误)如果我不在序列化器上使用验证器,而只在模型中使用约束?或者它会给出一些不同的错误?
    • @anveshagarwal 你提到的问题实际上包含两个不同的东西,将引起进一步的讨论。要回答您关于模型unique_together 的问题,数据库将针对任何违规行为吐出错误,并记住您只能使用模型上定义的字段(您会得到与第一个示例相同的错误)任何不存在的字段名称的问题)。
    猜你喜欢
    • 2016-09-08
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2019-02-24
    • 1970-01-01
    • 2017-12-14
    • 2020-08-09
    相关资源
    最近更新 更多