i am trying to insert data into my OrderItem() model:
class OrderItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
ordered = models.BooleanField(default=False)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
with an api with json data as follows:
{ "username": "admin",
"item": "Kavya",
"quantity": "1"
}
and i my view i am recieving this data and updating like:
class addtoCart(APIView):
# permission_classes=[IsAuthenticated,]
# authentication_classes=[TokenAuthentication,]
def post(self,request):
username=request.data["username"]
itemname=request.data["item"]
quant=request.data["quantity"]
#inserting data to cart
article = OrderItem()
article.User = username
article.Item = itemname
article.quantity=quant
article.save()
query=OrderItem.objects.filter(user=username)
serializers=OrderItemSerializer(query,many=True)
return Response(serializers.data)
but whenever i try to do so i get an error:
IntegrityError at /apis/addtoCart NOT NULL constraint failed: core_orderitem.item_id
i dont know what causing this error can someone please help <3.
CodePudding user response:
You need to pass an id or other unique constraint in your request body, so that you can identify which Item object to set to the article instance, e.g.:
{
"username": "admin",
"item_id": <id>,
"quantity": "1"
}
and in your post method:
from django.shortcuts import get_object_or_404
def post(self,request):
username = request.data["username"]
item_id = request.data["item_id"]
quant = request.data["quantity"]
# since `user` is also a foreign key reference i would suggest you to query it, too
user = get_object_or_404(User, username=username)
article = OrderItem()
# set the attributes as lowercase
article.user = user
# Django creates an extra field `<foreign_key>_id` for related objects, so that you can set it without querying
article.item_id = item_id
article.quantity = quant
article.save()
# ...
But I would suggest you using DRF Serializers for dealing with request.data.
