1

I'm trying to make an API for a butcher. With this API and the website that I will build by the next, the client will be able to make his order remotly. Here is my probleme. With the order form, the client send me JSON data like here :

{
    "user": 8,
    "orderDay": "2020-06-24",
    "deliveryDay": "2020-06-30",
    "deliveryAddress": "Place des Fêtes",
    "comment": "",
    "orderDetail": 
    [
        {
            "product": 2,
            "byProduct": 2,
            "quantity": 43
        },
        {
            "product": 3,
            "byProduct": 3,
            "quantity": 5
        }
    ]
}

These data must be saved in the database. These are the models that I use : models.py

class order(models.Model):
    user = models.ForeignKey(memberArea, on_delete=models.CASCADE)
    comment = models.TextField(null=True, blank=True)
    orderDay = models.DateTimeField(auto_now_add=True)
    deliveryDay = models.DateField()
    deliveryAddress = models.CharField(max_length=255)
    state = models.CharField(max_length=255)
    price = models.TextField(null=True, blank=True)
    response = models.TextField(null=True, blank=True)

class orderDetail(models.Model):
    order = models.ForeignKey(order, on_delete=models.CASCADE)
    product = models.ForeignKey(product, on_delete=models.CASCADE)
    byProduct = models.ForeignKey(byProduct, on_delete=models.CASCADE)
    quantity = models.CharField(max_length=255)

class product(models.Model):
    name = models.CharField(max_length=255)
    prix_uni = models.TextField(null=True, blank=True)
    prix_kg = models.TextField(null=True, blank=True)
    dispo = models.BooleanField(null=True, blank=True)
    category = models.ForeignKey(category, on_delete=models.CASCADE)
    redu = models.TextField(null=True, blank=True)

class byProduct(models.Model):
    product = models.ForeignKey(product, on_delete = models.CASCADE)
    name = models.CharField(max_length=255)

I make a serializer file like this serializer.py

class orderDetailSerializer(serializers.ModelSerializer):

    order = serializers.PrimaryKeyRelatedField(many=False, queryset = order.objects.all())

    class Meta:
        model = orderDetail
        fields = '__all__'

class OrderSerializer(serializers.ModelSerializer):

    orderDetail = orderDetailSerializer(many=True)

    class Meta:
        model = order
        fields = ['user', 'comment', 'deliveryAddress', 'deliveryDay', 'orderDetail']

    def create(self, validated_data):
            order_detail_data = validated_data.pop('orderDetail')
            new_order = order.objects.create(**validated_data)
            new_order.save()
            for product in order_detail_data:
                order_detail = orderDetail.objects.create(order=new_order, **product)
                new_order.orderDetail.add(order_detail.id)
            
            return new_order

And this is my view : views.py:

#Make an order
@api_view(['POST'])
def order(request, format=None):
    if request.method == 'POST':
        serializer = OrderSerializer(data=request.data)
        data = {}
        if serializer.is_valid():
            serializer.save()
            data['response'] = "Your order went well"
            return Response(data)
        return Response(serializer.errors)

When I try to run my code, it tells me that the order data is missing :

{
    "orderDetail": [
        {
            "order": [
                "This field is required."
            ]
        },
        {
            "order": [
                "This field is required."
            ]
        }
    ]
}

I don't know how to add this because the order_id that I need is created at the same time that the orderDetail. Thank's by advance for helping me.

1 Answer 1

4

you should make order field readonly in orderDetailSerializer:

class orderDetailSerializer(serializers.ModelSerializer):

    class Meta:
        model = orderDetail
        fields = '__all__'
        read_only_fields = ('order',)
        
Sign up to request clarification or add additional context in comments.

2 Comments

When I make this field read_only I get this error : AssertionError: Relational fields should not provide a queryset` argument, when setting read_only=True.`
you da real mvp :D

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.