ModelSerializer需要实例中的字段数据

时间:2019-02-17 22:12:47

标签: django django-rest-framework

我有以下序列化器:

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字段中的正确方法是什么,因为此序列化程序用于返回所有数据作为响应。

谢谢

3 个答案:

答案 0 :(得分:1)

在模型序列化器中将所需标志设置为 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 = '-')

答案 1 :(得分:1)

You can set data as a dict with all keys not as request.data like so

data = {'report': report.id, **request.data}

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

答案 2 :(得分:0)

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

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

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