-1

When sending json to the server, it shows the following error:

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

Help me please. I recently started to study DRF, and I don't understand how to correctly write def create in django to write data to a foreign key model?

Here is my code 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)**

Here is the json I am trying to send

{
        "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
            },
        ],
    }
Sunderam Dubey
  • 1
  • 11
  • 20
  • 40
sk1p
  • 77
  • 9

2 Answers2

1

I think You need to upload the item_ids data.

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

And in this case, the payload should be

{
    "doc_type": "capitalize",
    "date": "2022-06-04",
    "number": 98,
    "contragent_id": 4,
    "comment": "",
    "item_ids": [18],
}
Metalgear
  • 3,391
  • 1
  • 7
  • 16
0

This solved my problem

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
sk1p
  • 77
  • 9