sei-ec-remote / project-4-issues

Open an issue to receive help on project 4
0 stars 0 forks source link

KeyError when requesting in Postman #22

Closed katherine-kania closed 2 years ago

katherine-kania commented 2 years ago

What stack are you using?

(ex: MERN(mongoose + react), DR(django + react), PEN, etc.)

DR

What's the problem you're trying to solve?

When I try to create an order in postman, I get an error of:

File "/Users/kasiakania/sei/django-env/project-4-api/api/views/order_views.py", line 27, in post
    request.data['order']['owner'] = request.user.id
KeyError: 'order'

Post any code you think might be relevant (one fenced block per file)

from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.exceptions import PermissionDenied
from rest_framework import generics, status
from django.shortcuts import get_object_or_404

from ..models.order import Order
from ..serializers import OrderSerializer

# Create your views here.
class Orders(generics.ListCreateAPIView):
    permission_classes=(IsAuthenticated,)
    serializer_class = OrderSerializer
    def get(self, request):
        """Index request"""
        # Get all the orders:
        # orders = Order.objects.all()
        # Filter the orders by owner, so you can only see your owned orders
        orders = Order.objects.filter(owner=request.user.id)
        # Run the data through the serializer
        data = OrderSerializer(orders, many=True).data
        return Response({ 'orders': data })

    def post(self, request):
        """Create request"""
        # Add user to request data object
        request.data['order']['owner'] = request.user.id
        # Serialize/create mango
        order = OrderSerializer(data=request.data['order'])
        # If the order data is valid according to our serializer...
        if order.is_valid():
            # Save the created order & send a response
            order.save()
            return Response({ 'order': order.data }, status=status.HTTP_201_CREATED)
        # If the data is not valid, return a response with the errors
        return Response(order.errors, status=status.HTTP_400_BAD_REQUEST)
from django.db import models
from django.contrib.auth import get_user_model
from .flower import Flower

# Create your models here.
class Order(models.Model):
  # define fields
  # https://docs.djangoproject.com/en/3.0/ref/models/fields/

  name= models.CharField(max_length=100)
  size= models.CharField(max_length=100)
  price_range = models.CharField(max_length=100)
  color = models.CharField(max_length=100)
  flower = models.ForeignKey(
      Flower,
      on_delete=models.CASCADE,
      related_name='flower_id'
  )
  vase = models.CharField(max_length=100)
  owner = models.ForeignKey(
      get_user_model(),
      on_delete=models.CASCADE,
      related_name='user_id'
  )

  def __str__(self):
    # This must return a string
    return f"The order named '{self.name}' is {self.color} in color."

  def as_dict(self):
    """Returns dictionary version of Order models"""
    return {
        'id': self.id,
        'name': self.name,
        'size': self.size,
        'price_range': self.price_range,
        'color': self.color,
        'vase': self.vase,
    }

If you see an error message, post it here. If you don't, what unexpected behavior are you seeing?

image

What is your best guess as to the source of the problem?

It maybe has something to do with my user not populating with the post? or this line?

  # Add user to request data object
        request.data['order']['owner'] = request.user.id
        # Serialize/create order
        order = OrderSerializer(data=request.data['order'])

What things have you already tried to solve the problem?

I tried finding similar issues through google but no win.

Paste a link to your repository here https://github.com/katherine-kania/project-4-api

timmshinbone commented 2 years ago

maybe try request.data.order['owner'] = request.user.id ?

katherine-kania commented 2 years ago

hmm.. I get a new error:

    request.data.order['owner'] = request.user.id
AttributeError: 'dict' object has no attribute 'order'
timmshinbone commented 2 years ago

ok now try it like this and see what it says: request.data['order'].owner = request.user.id

katherine-kania commented 2 years ago

Christos and I solved it. Django is very picky. We removed ['order'] from both request that datas.

def post(self, request):
        """Create request"""
        # Add user to request data object
        request.data['owner'] = request.user.id
        # Serialize/create order
        order = OrderSerializer(data=request.data)
        # If the order data is valid according to our serializer...
        if order.is_valid():
            # Save the created order & send a response
            order.save()
            return JsonResponse({ 'order': order.data }, status=status.HTTP_201_CREATED)
        # If the data is not valid, return a response with the errors
        return JsonResponse(order.errors, status=status.HTTP_400_BAD_REQUEST)

PLUS ... We learned that Django is picky between the two ways data is returned wether it being a Response and JsonResponse:

return JsonResponse({'flowers': data})
return Response(data)