如何以自定义 json 格式返回数据?

Posted

技术标签:

【中文标题】如何以自定义 json 格式返回数据?【英文标题】:How to return data in custom json format? 【发布时间】:2020-03-14 17:25:35 【问题描述】:

模型

class Transaction(models.Model):
    created_at = models.DateTimeField()
    transaction_type = models.ForeignKey(
        TransactionType,
        on_delete=models.CASCADE
    )

class Transfer(models.Model):
    transaction_id = models.ForeignKey(
        Transaction,
        on_delete=models.CASCADE
    )
    debit = models.ForeignKey(
        Account,
        on_delete=models.CASCADE,
        related_name='debit'
    )

序列化器用于获取 json

class TransferSerializer(serializers.ModelSerializer):
    class Meta:
        model = Transfer
        fields = ('created_at', 'debit',)

class TransactionSerializer(serializers.ModelSerializer):
    transfers = TransferSerializer(many=True)
    class Meta:
        model = Transaction
        fields = ('created_at', 'transaction_type', 'transfers')

观看次数

class TransactionViewSet(viewsets.ModelViewSet):
    queryset = Transaction.objects.all()
    serializer_class = TransactionSerializer
    pagination_class = LimitOffsetPagination

如何返回以下json格式的数据? 最好的方法是什么? 当我尝试运行它时,出现错误“在序列化程序 TransactionSerializer 上尝试获取字段 transfers 的值时出现错误。”


  "created_at": "2019-08-18",
  "transaction_type_id": "1",
  "transfers": "debit": "100",

【问题讨论】:

Nested relationships 【参考方案1】:

在您的Transfer 模型中,在事务ForeignKey 中,添加related_name=transfers

在您的TransactionSerializer 中,添加类属性:

transfers = TransferSerializer(many=True)
编辑:在您的TransferSerializer 中,将fields 修改为fields=('created_at','transaction_type_id', 'transfers') 这将为您提供:

  "created_at": "2019-08-18",
  "transaction_type_id": "1",
  "transfers": [
    "transfer_type": 1, "debit": "100", ...,
    ...
  ],

【讨论】:

我收到错误Got AttributeError when attempting to get a value for field `transfers` on serializer `TransactionSerializer`. 尝试用fields=('created_at','transaction_type_id', 'transfers')指定TransactionSerializerfields 遇到同样的错误Got AttributeError when attempting to get a value for field `transfers` on serializer `TransactionSerializer 您能更新原始帖子中的模型和序列化程序吗? 请在您的传输模型中的交易外键中添加related_name='transfers'

以上是关于如何以自定义 json 格式返回数据?的主要内容,如果未能解决你的问题,请参考以下文章

pymysql返回数据的处理

1.3WEB API 默认以json格式返回数据,同时定义时间格式,返回格式

如何返回json格式的数据才能让Chrome的preview下直接显示数据

如何从 csv 文件中以自定义格式读取时间?

ASP.Net Core 返回的json数据,自定义日期格式

java如何返回json格式