Python 向自相关模型上的序列化程序添加可扩展字段

Python 向自相关模型上的序列化程序添加可扩展字段,python,django-rest-framework,django-serializer,Python,Django Rest Framework,Django Serializer,我有一个用户详细信息的模型,它是自相关的,用于创建两个用户之间的关系 模型 视图集 class AdvDetailsViewSet(viewsets.ModelViewSet): serializer_class = AdvDetailsSerializer filter_backends = (filters.SearchFilter,DjangoFilterBackend, filters.OrderingFilter) filter_fields = ('email

我有一个用户详细信息的模型,它是自相关的,用于创建两个用户之间的关系

模型

视图集

class AdvDetailsViewSet(viewsets.ModelViewSet):
    serializer_class = AdvDetailsSerializer
    filter_backends = (filters.SearchFilter,DjangoFilterBackend, filters.OrderingFilter)
    filter_fields = ('email_id,'parent_profile')
    search_fields = (  '^first_name',)

    def get_queryset(self):
        return AdvDetails.objects.all()
序列化程序

class AdvDetailsSerializer(serializers.ModelSerializer):

    class Meta:
        model = AdvDetails
        fields = '__all__'
这种结构有助于我获得以下格式的数据

{
  "user_id": "055cbde6-10ea-4558-86fc-1b42624ce760",
  "title": "Mr",
  "first_name": "foo",
  "last_name": "bar",
  "email_id" : "foo@bar.com"
  "parent_profile":"6c429d4c-9fb4-42e5-9d7d-9fc782f81fb0"
}
我想修改序列化程序,以便获得父配置文件的
email\u id
数据,如下所示

{
  "user_id": "055cbde6-10ea-4558-86fc-1b42624ce760",
  "title": "Mr",
  "first_name": "foo",
  "last_name": "bar",
  "email_id" : "foo@bar.com",
  "parent_profile":"6c429d4c-9fb4-42e5-9d7d-9fc782f81fb0",
  "parent_email_id" : "parent@email.com"
}

非常感谢您的帮助。我尝试了
PrimaryKeyRelatedField
,但没有解决我的问题。

我制作了一个包,允许根据请求动态扩展字段:

对于您的情况:

class AdvDetailsSerializer(FlexFieldsModelSerializer):
类元:
model=AdvDetails
字段=('user\u id','title','first\u name','last\u name','email\u id','parent\u profile','parent\u email\u id')
可扩展_字段={'parent_profile':'.AdvDetailsSerializer'}
替换为定义序列化程序的Django应用程序的名称,以便可以延迟加载

如果您希望静态扩展字段,则可以将该字段定义为嵌套序列化程序:

class AdvDetailsSerializer(serializers.ModelSerializer):
parent_profile=profileserializer()
类元:
model=AdvDetails
字段=(
“用户id”,
“头衔”,
“名字”,
“姓”,
“电子邮件地址”,
“家长档案”,
'家长\u电子邮件\u id'
)

感谢您推荐此软件包,这对我很有用。在没有软件包的情况下,有没有一种本地方法可以做到同样的事情?。我在meta类中尝试了
depth=1
,但我对字段没有任何控制权。这里是
ParentProfileSerializer()
同一模型的另一个序列化程序,它只包含所需的字段吗?是的,这会起作用。或者,您可以查看
SerializerMethodField
(),该字段允许您添加一个方法来返回定制的序列化数据(它将作为参数传递给父级
AdvDetails
)。如果你想要一个更灵活的解决方案(如任意树深度),你可以看看。非常感谢,@Rob。上述解决方案效果很好。
{
  "user_id": "055cbde6-10ea-4558-86fc-1b42624ce760",
  "title": "Mr",
  "first_name": "foo",
  "last_name": "bar",
  "email_id" : "foo@bar.com",
  "parent_profile":"6c429d4c-9fb4-42e5-9d7d-9fc782f81fb0",
  "parent_email_id" : "parent@email.com"
}