Django rest框架序列化程序-多次序列化单个模型字段

Django rest框架序列化程序-多次序列化单个模型字段,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,我想在输出json中多次序列化一个相关字段。第一个应该包含相关对象的pk,第二个表示应该是超链接。有什么好办法吗?我知道SerializerMethodField,但我发现它不是优雅的方法 我的模型: 我想要的是: 按如下方式序列化我的订单模型: { "title": "Alice in wonderland", "person": 1, # represents persons's primary key "person_url": "/person-detail/1

我想在输出json中多次序列化一个相关字段。第一个应该包含相关对象的
pk
,第二个表示应该是超链接。有什么好办法吗?我知道SerializerMethodField,但我发现它不是优雅的方法

我的模型: 我想要的是: 按如下方式序列化我的订单模型:

{
    "title": "Alice in wonderland",
    "person": 1,  # represents persons's primary key
    "person_url": "/person-detail/1" 
}
我尝试的内容/我的序列化程序:
但在这种情况下,Django在逻辑上抱怨数据库中缺少
person\uURL
字段。如何进行

你的方法非常接近。几点注意:

  • 如果你想要pk,你不需要指定
    person
    整数字段,你可以免费获得它(
    ModelSerializer
    将自动创建一个名为
    person
    PrimaryKeyRelatedField
  • 您不必在此处指定
    字段。DRF为您提供自动生成的字段以及序列化程序上显式定义的字段
  • lookup_字段
    默认为
    pk
  • 假设您的视图名称正确(我看不到您的URL),您的
    HyperlinkRelatedField
    中缺少的只是一个
    source
    属性
  • 把它放在一起,像这样的东西应该会起作用:

    class OrderSerializer(serializers.ModelSerializer):
        person_url = serializers.HyperlinkedRelatedField(
            view_name='myapp:user-profile',
            source='person',
            read_only=True
        )
    
        class Meta:
            model = Order
            fields='__all__'
            read_only_fields = ('__all__',)
    

    注意:对于my urls.py,我有一个视图名称,它看起来更像
    个人详细信息

    您的方法非常接近。几点注意:

  • 如果你想要pk,你不需要指定
    person
    整数字段,你可以免费获得它(
    ModelSerializer
    将自动创建一个名为
    person
    PrimaryKeyRelatedField
  • 您不必在此处指定
    字段。DRF为您提供自动生成的字段以及序列化程序上显式定义的字段
  • lookup_字段
    默认为
    pk
  • 假设您的视图名称正确(我看不到您的URL),您的
    HyperlinkRelatedField
    中缺少的只是一个
    source
    属性
  • 把它放在一起,像这样的东西应该会起作用:

    class OrderSerializer(serializers.ModelSerializer):
        person_url = serializers.HyperlinkedRelatedField(
            view_name='myapp:user-profile',
            source='person',
            read_only=True
        )
    
        class Meta:
            model = Order
            fields='__all__'
            read_only_fields = ('__all__',)
    

    注意:对于我的url.py,我有一个视图名,它看起来更像
    个人详细信息

    的魅力!看起来我忽略了一个
    person
    参数。不过,你是对的:我缺少
    Meta.fields
    。当您有
    只读字段时,不确定是否需要显式
    只读
    参数,但我添加了这些字段以防万一。不要被我删除的注释所愚弄。与只读内容相关的失败是由我的本地无关代码引起的。效果很好!看起来我忽略了一个
    person
    参数。不过,你是对的:我缺少
    Meta.fields
    。当您有
    只读字段时,不确定是否需要显式
    只读
    参数,但我添加了这些字段以防万一。不要被我删除的注释所愚弄。与只读内容相关的故障是由本地无关代码引起的。
    class OrderSerializer(serializers.ModelSerializer):
        person_url = serializers.HyperlinkedRelatedField(
            view_name='myapp:user-profile',
            source='person',
            read_only=True
        )
    
        class Meta:
            model = Order
            fields='__all__'
            read_only_fields = ('__all__',)