簡體   English   中英

如何在 DRF 序列化程序中為外鍵模型創建值?

[英]How to create values to foreign key model in DRF serializer?

將json發送到服務器時,顯示以下錯誤:

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

請幫幫我。 最近開始研究DRF,不明白如何在django中正確編寫def create將數據寫入外鍵模型?

這是我的代碼serializer.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
            },
        ],
    }

我認為您需要上傳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],
}

這解決了我的問題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM