【问题标题】:How to validate the length of nested items in a serializer?如何验证序列化程序中嵌套项的长度?
【发布时间】:2015-01-12 06:39:35
【问题描述】:

我正在使用 Django Rest Framework 2.4。 在我期望包含两个键的字典的 API 中:

{
  "category" : <category-id>,
  "items" : [{"title": <title>}, {"title": <title>}, {"title": <title>}, ....]
}

我有一个接受这本字典的ItemListSerializer。 category 是 Category 模型的外键,因此我们得到了该数据。 category 有一个 limit 属性,

我有一个由嵌套 ItemSerializer 处理的项目列表,其中许多设置为 True

但是,我想检查项目总数是否超过基于类别的限制?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    在序列化器上使用validate()方法检查长度,如果不通过则提升ValidationError

    class YourSerializer(serializers.Serializer):
          items = ItemSerializer(many=True)
    
          def validate(self, attrs):
               if len(attrs['items']) > YOUR_MAX:
                   raise serializers.ValidationError("Invalid number of items")
    

    【讨论】:

    • 在验证嵌套项序列化程序之前会调用 validate() 方法吗?
    • @AmoghTalpallikar,我不这么认为。不过那会很奇怪。孩子必须在父母验证之前有效。
    • 这对我来说是个问题,因为那时我将根据它的索引来验证每个项目。如果索引超出类别预期,这可能是一个问题,如果我在每个点检查索引后引发验证错误,每个项目都会出错。
    • @AmoghTalpallikar,您可以访问categoryitems 进行验证的唯一地方是我上面描述的地方。我正在使用相同的东西,并且效果很好。如果ItemSerializer 有任何问题,那么您甚至不会走那么远。
    【解决方案2】:

    您可以创建validate_items()

    Django rest 框架会将错误显示为该字段的字段错误。所以解析响应会更容易

    class YourSerializer(serializers.Serializer):
        items = ItemSerializer(many=True)
    
        def validate_items(self, items):
            if len(items) > YOUR_MAX:
                raise serializers.ValidationError("Invalid number of items")
    

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 2018-07-06
      • 2016-11-21
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多