【发布时间】:2018-05-08 17:13:22
【问题描述】:
有一些示例如何创建像this 这样的可写嵌套序列化程序,以及如何序列化通用外键 (here)。
但我找不到如何同时执行这两项操作,即如何为通用外键字段创建嵌套的可写序列化程序。
在我的模型中,有一个 Meeting 模型和一个 GenericForeignKey,它可以是 DailyMeeting 或 WeeklyMeeting,例如:
class Meeting(models.Model):
# More fields above
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
recurring_meeting = GenericForeignKey('content_type', 'object_id')
class DailyMeeting(models.Model):
meeting = GenericRelation(Meeting)
# more fields
class WeeklyMeeting(models.Model):
meeting = GenericRelation(Meeting)
# more fields
然后我在serializers.py 中创建了一个自定义字段:
class RecurringMeetingRelatedField(serializers.RelatedField):
def to_representation(self, value):
if isinstance(value, DailyMeeting):
serializer = DailyMeetingSerializer(value)
elif isinstance(value, WeeklyMeeting):
serializer = WeeklyMeetingSerializer(value)
else:
raise Exception('Unexpected type of tagged object')
return serializer.data
class MeetingSerializer(serializers.ModelSerializer):
recurring_meeting = RecurringMeetingRelatedField()
class Meta:
model = Meeting
fields = '__all__'
我传递的 JSON 格式如下:
{
"start_time": "2017-11-27T18:50:00",
"end_time": "2017-11-27T21:30:00",
"subject": "Test now",
"moderators": [41],
"recurring_meeting":{
"interval":"daily",
"repetitions": 10,
"weekdays_only": "True"
}
}
但问题是我收到以下错误:
AssertionError:关系字段必须提供
queryset参数,覆盖get_queryset,或设置 read_only=True。
为什么关系字段必须是read_only?如果我将其设置为read_only,那么它不会在序列化程序中的data 中传递。
我必须提供什么类型的查询集?
【问题讨论】:
-
我没有检查场景但是你不必从 api 传递 recurring_meeting .. (它添加在序列化程序 create() 方法中)所以你可以设置
read_only -
如果将其设置为
read_only,则validated_data中没有任何内容传递给create()方法。因此,在这种情况下,recurring_meeting 将被完全忽略。
标签: django django-rest-framework django-serializer