Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何定制Django Rest框架序列化程序的输出?_Python_Django_Json_Django Rest Framework - Fatal编程技术网

Python 如何定制Django Rest框架序列化程序的输出?

Python 如何定制Django Rest框架序列化程序的输出?,python,django,json,django-rest-framework,Python,Django,Json,Django Rest Framework,我有一个Django模型是这样的: class WindowsMacAddress(models.Model): address = models.TextField(unique=True) mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses') 和两个序列化程序,定义为: class WindowsFlatMacAddressSerializer(serialize

我有一个Django模型是这样的:

class WindowsMacAddress(models.Model):
    address = models.TextField(unique=True)
    mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses')
和两个序列化程序,定义为:

class WindowsFlatMacAddressSerializer(serializers.Serializer):
    address = serializers.Field()

class WindowsCompleteMappingSerializer(serializers.Serializer):
    id = serializers.Field()
    macAddresses = WindowsFlatMacAddressSerializer(many=True)
    clientId = serializers.Field()
通过视图访问序列化程序时,我得到以下输出:

[
    {
        "id": 1, 
        "macAddresses": [
            {
                "address": "aa:aa:aa:aa:aa:aa"
            }, 
            {
                "address": "bb:bb:bb:bb:bb:bb"
            }
        ], 
        "clientId": null
    }
]
差不多不错,不过我更喜欢:

[
    {
        "id": 1, 
        "macAddresses": [
            "aa:aa:aa:aa:aa:aa",
            "bb:bb:bb:bb:bb:bb"
        ],
        "clientId": null
    }
]
如何实现这一点?

创建一个
并将其实现为\u native
,以便它返回您想要的列表

如果您使用,那么类似的方法可能会起作用:

class CustomField(Field):
    def to_native(self, obj):
        return obj.macAddresses.all()
我希望这有帮助

djangorestframework>=3.9.1的更新

根据,现在需要重写
to_representation()
to_internal_value()
方法中的一个或两个。范例

class CustomField(Field):
    def to_representation(self, value)
        return {'id': value.id, 'name': value.name}

卡尔顿的回答会起作用的。你还可以采取其他几种方法

您还可以使用目标上的给定字段使用表示关系的
SlugRelatedField

比如说

class WindowsCompleteMappingSerializer(serializers.Serializer):
    id = serializers.Field()
    macAddresses = serializers.SlugRelatedField(slug_field='address', many=True, read_only=True)
    clientId = serializers.Field()
或者,如果
WindowsMacAddress
\uuuu str\uuuu
仅显示地址,则您可以简单地使用
RelatedField
,这是一个基本的只读字段,将为您提供关系目标的简单字符串表示

# models.py
class WindowsMacAddress(models.Model):
    address = models.TextField(unique=True)
    mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses')

    def __str__(self):
        return self.address

# serializers.py
class WindowsCompleteMappingSerializer(serializers.Serializer):
    id = serializers.Field()
    macAddresses = serializers.RelatedField(many=True)
    clientId = serializers.Field()

浏览一下,以更好地了解可以在API中表示关系的各种方法。

Hmm我认为
RelatedField
SlugRelatedField
仅适用于
ModelSerializer
?所有关系字段都适用于Django模型关系。无论是用于
序列化程序
还是
模型序列化程序
类,它们都可以正常工作。谢谢!这对我以后会很有用。所有的链接都断了,你能更新一下吗