Saving FieldIn Django Via API Call

I'm trying to create a new CustomerDetail object whenever an api is called.But the issue is, Whenever I try to create something for the favorite meal multi-selectfield, I get this error:

MultiValueDictKeyError at /api/customer/favorite_meal/
"'favorite_meal'"

This is the api:

@csrf_exempt
def favorite_meal(request):

    if request.method == "POST":

      access_token = AccessToken.objects.get(token = request.GET.get("access_token"),
      expires__gt = timezone.now())

      customer = access_token.user.customer

    details = CustomerDetailSerializer(
            CustomerDetails.objects.create(
            customer = customer,
            favorite_mean = request.POST["favorite_meal"]
            ))

    return JsonResponse({"status" : "success"})

Here are my models:

class CustomerDetails(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='customer')

    TYPE = (
    ('Time', (
        ('Breakfast', 'Breakfast'),
        ('Lunch', 'Lunch'),
        ('Dinner', 'Dinner'),
            )),
        )
   
    favorite_meal = MultiSelectField(choices=TYPE)
    interested_in = MultiSelectField(choices=CATEGORIES)
    likes = models.ManyToManyField('Product')
    completed_orders = models.IntegerField(default = "0", blank=True)
    shares = models.IntegerField(default = "0", blank=True)
    average_order = models.FloatField(default = "0.0", blank=True)

    def __str__(self):
        return self.customer.user.get_full_name()

In the request, I'm trying to select breakfast and lunch via the api. How would I do this?

Sending Params:

The status says success but, there is no Customer data in details

enter image description here

Upvotes: 0

Views: 30

Answers (1)

JPG
JPG

Reputation: 88459

The MultiValueDictKeyError error raises when you are trying to access favorite_meal from request.POST, but the favorite_meal doesn't exist in request.POST Try this

@csrf_exempt
def favorite_meal(request):
    if request.method == "POST":
        if not 'access_token' in request.POST:
            return JsonResponse({"status": "'access_token' missing in POST payload"})
        access_token = AccessToken.objects.get(token=request.POST.get("access_token"),
                                               expires__gt=timezone.now())

        customer = access_token.user.customer

    if not 'favorite_meal' in request.POST and not request.POST["favorite_meal"]:
        return JsonResponse({"status": "'favorite_meal' missing in POST payload"})
    details = CustomerDetailSerializer(
        CustomerDetails.objects.create(
            customer=customer,
            favorite_mean=request.POST["favorite_meal"]
        ))


    return JsonResponse({"status": "success"})


Screenshot Postamn screenshot



UPDATE

@csrf_exempt
def favorite_meal(request):
    if request.method == "POST":
        if not 'access_token' in request.POST:
            return JsonResponse({"status": "'access_token' missing in POST payload"})
        access_token = AccessToken.objects.get(token=request.POST.get("access_token"),
                                               expires__gt=timezone.now())

        customer = access_token.user.customer

    if not 'favorite_meal' in request.POST and not request.POST["favorite_meal"]:
        return JsonResponse({"status": "'favorite_meal' missing in POST payload"})
    for favorite_meal in request.POST["favorite_meal"]:
        details = CustomerDetailSerializer(
            CustomerDetails.objects.create(
                customer=customer,
                favorite_mean=favorite_meal
            ))


    return JsonResponse({"status": "success"})

Upvotes: 1

Related Questions