【问题标题】:Django Rest Framework different serializers for on model模型上的 Django Rest Framework 不同的序列化程序
【发布时间】:2019-05-25 12:13:32
【问题描述】:

我有模特,比如:

 def SomeModel(models.Model):
     serial_num = models.IntegerField(unique=True)
     count = models.IntegerField()

并且必须创建 2 个适用于此模型的 url。 但是,必须有 2 个不同的序列化器。例如:

  • 对于第一个 url,用户数据必须有两个文件(serial_num 和 count) 对于第二个 url,用户的数据必须只有一个字段(count)。
  • 在第二种情况下,将在 Serializers 类中生成 serial_num。

为一个模型制作 2 个不同的序列化程序是一种好习惯吗?

还有一个问题,验证呢?

字段“计数”取决于另一个模型。我认为将验证放入序列化程序类。但我不想在 2 个不同的序列化程序类(两个 url)中有 2 个相同的验证代码块。

【问题讨论】:

  • 我没有看到为 1 个模型使用多个序列化程序的问题 - 对于不同的行为,您只需要为每个序列化程序提供单独的视图。
  • 但是验证呢?两个操作系统序列化程序都必须验证依赖于另一个模型的字段“count”。
  • 是的,您为每个序列化程序编写不同的验证。当然,您可以将其作为一个单独的函数,然后在序列化程序中调用它,通过 DRY。
  • 然后您可以编写一个单独的类(又名 Mixin)来封装此验证,然后将此 mixin(从此类继承)应用于两个序列化程序
  • 验证模型对象的更好方法是什么?在 Model 类还是在 Serializer 类中?

标签: django django-rest-framework


【解决方案1】:

您应该使用两个序列化程序并使用inheritance 进行常见的验证逻辑。

【讨论】:

    【解决方案2】:

    创建两个序列化程序并将每个视图分配给该特定序列化程序。

    例如,假设您有两条路径,例如 path1 和 path2:

    class MyModelViewSet(ModelViewSet):
        serializer_class = Serializer1
        queryset = YourModel.objects.all()
    
        @action(methods=['post'], detail=False, url_path='path1', serializer_class=Serializer1)
        def path1_view(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            .....
    
        @action(methods=['post'], detail=False, url_path='path2', serializer_class=Serializer2)
        def path2_view(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            .....
    

    对于序列化程序:

    class Serializer1(ModelSerializer):
        class Meta:
            model = SomeModel
            fields = ('serial_num', 'count',)
    
    class Serializer2(ModelSerializer):
        class Meta:
            model = SomeModel
            fields = ('count',)
    
        def validate(self, attrs):
            # Update attrs with serial_num here
            return attrs
    

    【讨论】:

    • 对于 list、create、update 等视图集操作,您必须重写 get_serializer_class() 方法并根据 self.action 属性返回正确的序列化程序类。检查this
    【解决方案3】:

    我找到了可能更有用的方法。 将服务用于业务逻辑。示例可以在这里阅读: https://github.com/HackSoftware/django-styleguide#examples

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      相关资源
      最近更新 更多