Django REST框架:插件或序列化器

时间:2018-12-20 08:32:39

标签: django-models django-rest-framework django-serializer

我正在将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_ridemail_rid进行POST / PATCH / PUT / DELETE并在GET中返回联系人和电子邮件字段。

我走对了吗?还有其他建议吗?

2 个答案:

答案 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”的更新路径下时,选中此选项不会提示选定的对象

选中this anwser