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"
}