我正在将Django Rest Framework用于一个项目,并且有这样的嵌套序列化器:
class TopSerializer(serializers.ModelSerializer):
contact = (something goes here)
email = (something goes here)
对于POST,PATCH,PUT,DELETE,我想用一个slug指定这些值。假设每个班级(联系人,电子邮件)都有一个名为resource_id
的成员,那是我的。对于这些方法,我可以使用:
class TopSerializer(serializers.ModelSerializer):
contact = serializers.SlugRelatedField(read_only=False, slug_field='resource_id')
email = serializers.SlugRelatedField(read_only=False, slug_field='resource_id')
但是,对于GET,我也想返回嵌入的对象,所以我可以使用:
class TopSerializer(serializers.ModelSerializer):
contact = ContactSerializer(read_only=True)
email = EmailSerializers(read_only=True)
那么,如何在序列化程序中指定contact
可以是子对象还是序列化的对象?有没有办法仅使用一个串行器来执行此操作,或者我必须有两个不同的串行器并在视图中使用request.method
选择我使用的串行器?
或者,我应该使用这样的东西吗?
class TopSerializer(serializers.ModelSerializer):
contact = ContactSerializer(read_only=True)
email = EmailSerializers(read_only=True)
contact_rid = serializers.SlugRelatedField(read_only=False,slug_field=resource_id,queryset=models.Contact.objects.all())
email_rid = serializers.SlugRelatedField(read_only=False,slug_field=resource_id,queryset=models.Email.objects.all())
这样,我可以使用contact_rid
和email_rid
进行POST / PATCH / PUT / DELETE并在GET中返回联系人和电子邮件字段。
我走对了吗?还有其他建议吗?
答案 0 :(得分:0)
签出自定义字段https://www.django-rest-framework.org/api-guide/fields/#custom-fields
您可以定义一个自定义序列化器字段,该字段将覆盖serializers.Field
和覆盖to_representation
以返回完全序列化的对象,并to_internal_value
以模仿slugRelatedField的行为。
答案 1 :(得分:0)
您步入正轨!
如果需要相关对象的更多详细信息,则使用一个相关字段进行写入,而使用另一个相关字段读取完整的对象是一个好方法。
如果希望该字段仅用于写入,还可以将标记write_only=True
添加到子字段。但是,当您处于“可浏览的API”的更新路径下时,选中此选项不会提示选定的对象