【问题标题】:How to create values to foreign key model in DRF serializer?如何在 DRF 序列化程序中为外键模型创建值?
【发布时间】:2022-06-25 20:27:50
【问题描述】:

发送json到服务器时,报错如下:

Direct assignment to the reverse side of a related set is prohibited. Use items.set() instead.

请帮帮我。最近开始研究DRF,不明白如何在django中正确编写def create将数据写入外键模型?

这是我的代码 序列化器.py

class ConsignmentNoteSerializer(serializers.ModelSerializer):
    create_user = serializers.HiddenField(default=serializers.CurrentUserDefault())
    create_user = UserSerializer(source='creator', read_only=True)
    contragent_detail = ContragentSerializer(source='contragent', read_only=True)
    items = ConsignmentItemSerializer(many=True)

    class Meta:
        model = ConsignmentNote
        fields = ['id', 'doc_type', 'date', 'number', 'contragent_detail', 'comment', 'create_user', 'items', 'created']
    
    **def create(self, validated_data):
        items_data = self.validated_data.pop('items')
        return ConsignmentNote.objects.create(**validated_data)**

这是我要发送的 json

{
        "id": 9,
        "doc_type": "capitalize",
        "date": "2022-06-04",
        "number": 98,
        "contragent_id": 4,
        "comment": "",
        "items": [
            {
                "id": 18,
                "product": 10,
                "buy_price": "200.00",
                "sell_price": "500.00",
                "quantity": 5
            },
        ],
    }

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    我认为您需要上传item_ids 数据。

    class ConsignmentNoteSerializer(serializers.ModelSerializer):
        ...
        item_ids = serializers.ListField(
            child = serializers.IntegerField,
            write_only = True
        )
    
        class Meta:
            model = ConsignmentNote
            fields = ['id', 'doc_type', 'date', 'number', 'contragent_detail', 'comment', 'create_user', 'items', 'created', 'item_ids']
        
        def create(self, validated_data):
            item_ids = self.validated_data.pop('item_ids')        
            new_obj = ConsignmentNote.objects.create(**validated_data)
            new_obj.set(item_ids)        
            return new_obj
    

    在这种情况下,有效载荷应该是

    {
        "doc_type": "capitalize",
        "date": "2022-06-04",
        "number": 98,
        "contragent_id": 4,
        "comment": "",
        "item_ids": [18],
    }
    

    【讨论】:

      【解决方案2】:

      这解决了我的问题

      def create(self, validated_data):
          items = validated_data.pop('items')
          note = ConsignmentNote.objects.create(**validated_data)
          for item in items:
              product = item.pop('product')
              item = ConsignmentItem.objects.create(consignmentnote=note, product=product ,**item)
          return note
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        • 1970-01-01
        相关资源
        最近更新 更多