Django Rest Framework,如何更新序列化程序中的嵌套值

Posted

技术标签:

【中文标题】Django Rest Framework,如何更新序列化程序中的嵌套值【英文标题】:Django Rest Framework, How to update nested values in serializer 【发布时间】:2022-01-22 00:42:51 【问题描述】:

在 DRF 中,我想将批量交易发布到我的休息端点。

在以下Serializer 中,在 DFR 中为 transactions 创建嵌套值字段的正确方法是什么?

您是否在TransactionItemSerializer

上为每笔交易拨打create

MasterSerializer创建自己的Transaction模型上调用save()>

例如:

class MasterSerializer(serializers.Serializer):

    transactions = TransactionItemSerializer(many=True)  # A nested list of 'transaction' items.

1 .更新MasterSerializer上的交易。

def create(self, validated_data):
    transactions = validated_data.pop('transactions')
    # for each transaction do Transaction Save()

2 。以某种方式调用TransactionItemSerializer 内的create 方法MasterSerializer 为每个事务创建方法,即

  class MasterSerializer(serializers.Serializer):

    transactions = TransactionItemSerializer(many=True)
    
    class Meta:
        fields = ['transactions']

    def create(self, validated_data):
        transactions = validated_data.pop('transactions')
        # call create on for each transaction TransactionItemSerializer.create() here

【问题讨论】:

【参考方案1】:

假设您的模型名称是“交易”并且它有“master”字段引用主交易,您可以这样做:

def create(self, validated_data):
    transactions = validated_data.pop('transactions', [])
    instance = super().create(validated_data)

    for transaction in transactions:
        Transaction.objects.create(master=instance, **transaction)

    instance.refresh_from_db()
    return instance

【讨论】:

我明白了。 Transaction.objects.create 会调用什么?模型创建还是转换 ModelSerializer 上的创建方法? 它将调用模型的create 方法,您不需要后者,因为数据已经通过序列化程序进行了验证,您可以简单地使用validated_data 使用模型的@987654324 创建一个新对象@ 我的主人Serialize 有这个字段...transactions = TransactionSerializer(many=True) By calling the model to create as suggested above, would this not bypass the TransactionSerializer` 创建?希望这不是愚蠢的问题,我试图更好地理解这一点。 ps TransactionSerializer 是一个ModelSerializer 可能是上面的 insetad,这样做会更好吗?...`transaction_serializer = TransactionSerializer(data=transactions, many=True)` 是的,你可以这样做,如果你引用TransactionSerializer中的主事务没有问题,那为什么不呢?

以上是关于Django Rest Framework,如何更新序列化程序中的嵌套值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Postman 表单数据在 Django REST Framework 中发布嵌套数组?

django-rest-framework:如何序列化已经包含 JSON 的字段?

如何仅使用 django 作为后端并使用 django-rest-framework 发布

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

django-rest-framework指南:Requests and Responses

django-rest-framework - 在可浏览的 API 中自动生成表单?