如何以自定义 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')
指定TransactionSerializer
元fields
遇到同样的错误Got AttributeError when attempting to get a value for field `transfers` on serializer `TransactionSerializer
您能更新原始帖子中的模型和序列化程序吗?
请在您的传输模型中的交易外键中添加related_name='transfers'
以上是关于如何以自定义 json 格式返回数据?的主要内容,如果未能解决你的问题,请参考以下文章
1.3WEB API 默认以json格式返回数据,同时定义时间格式,返回格式
如何返回json格式的数据才能让Chrome的preview下直接显示数据