【问题标题】:ModelSerializer required field data from instanceModelSerializer 需要来自实例的字段数据
【发布时间】:2019-07-11 07:12:01
【问题描述】:

我有以下序列化程序:

class TrackGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = TrackGroup
        fields = ('id', 'name', 'report', 'tracks')  # `report` is FK

我从 url 获取报告 ID,所以我认为这会起作用:

...
track_group = TrackGroup(report=report)
serializer = TrackGroupSerializer(
    instance=track_group,
    context=dict(request=request),
    data=request.data
)

if serializer.is_valid():
    ...

这不起作用,因为序列化程序对字段 report 有错误,因为该字段丢失并且是必需的。提供report 之类的数据并将其仍列在TrackGroupSerializer 字段中的正确方法是什么,因为此序列化程序用于返回所有数据作为响应。

谢谢

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    正确的解决方案似乎是partial=True:

    serializer = TrackGroupSerializer(
        instance=track_group,
        context=dict(request=request),
        data=request.data,
        partial=True
    )
    

    似乎比修改请求数据更干净。

    【讨论】:

      【解决方案2】:

      您可以将数据设置为包含所有键的字典,而不是像这样的 request.data

      data = {'report': report.id, **request.data}
      
      serializer = TrackGroupSerializer(
          instance=track_group,
          context=dict(request=request),
          data=data
      )
      

      【讨论】:

        【解决方案3】:

        在模型序列化程序中将所需标志设置为 False

        class TrackGroupSerializer(serializers.ModelSerializer):
            report = serializers.CharField(required=False)
            class Meta:
                model = TrackGroup
                fields = ('report', ...)
        

        如果您想创建序列化程序并保存模型实例而不为变量提供值,您始终可以在模型中为其设置默认值。

        在models.py中

        class TrackGroup(models.Model):
            report  = models.CharField(default = '-')
        

        【讨论】:

          猜你喜欢
          • 2017-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-16
          • 1970-01-01
          • 2018-01-13
          • 1970-01-01
          相关资源
          最近更新 更多