【问题标题】:Which is the best way to validate mutually exclusive fields in a Django Serializer?验证 Django 序列化程序中互斥字段的最佳方法是什么?
【发布时间】:2022-01-21 15:30:34
【问题描述】:

我有以下序列化程序:

class MutuallyExclusiveSerializer(serializers.Serializer):

    field_a = serializers.Charfield()

    field_b = serializers.Charfield()

    field_c = serializers.Charfield()

如果用户发送多个互斥字段,我想要一种可扩展的方式来引发错误。

我可以制作自定义验证器,但如果将来添加更多字段,则不容易扩展。在这种情况下推荐的方法是什么?

提前致谢!

【问题讨论】:

    标签: python django django-serializer


    【解决方案1】:

    我能想到的某种方法是覆盖您要进行验证的方法,假设您想在create 上做,您可以这样做:

    def create(self, validated_data):
        if validated_data.get('field_a') and validated_data.get('field_b') and validated_data.get('field_c'):
            return ERROR
        return Comment(**validated_data)
    

    附言。 ERROR 我的意思是在这种情况下你可以做任何你想做的事情。

    【讨论】:

    • 但这不可扩展,因为如果您有 50 个字段,则必须验证 50 个条件
    • @SantiagoOrtizCeballos 这只是为了创建一个想法,好像有 50 个字段,您可以创建一个 for 循环,该循环遍历包含所有字段的数组,您可以检查 2 个字段是否在验证数据中你可以在那个时候返回 False 所以平均复杂度是 O(logN)
    【解决方案2】:

    最后,我决定这样做:

    def validate(self, attrs):
        # Validates that only one element is added
        items = len([attr for attr in attrs.values() if attr is not None])
        if items != 1:
            raise serializers.ValidationError('Please add just 1 item at a time')
    
        return attrs
    

    但如果有更好的方法,那就太好了。

    【讨论】:

      猜你喜欢
      • 2018-08-22
      • 2010-09-27
      • 1970-01-01
      • 2014-08-05
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2014-11-25
      相关资源
      最近更新 更多