我有以下序列化器:
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
字段中的正确方法是什么,因为此序列化程序用于返回所有数据作为响应。
谢谢
答案 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
)
似乎比修改请求数据更干净。