IntegrityError at /apis/addtoCart NOT NULL constraint failed Django and API?
я пытаюсь вставить данные в модель OrderItem():
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)
с api с данными в формате json следующим образом:
{ "username": "admin",
"item": "Kavya",
"quantity": "1"
}
и я получаю эти данные и обновляю их следующим образом:
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)
но всякий раз, когда я пытаюсь это сделать, я получаю ошибку:
IntegrityError at /apis/addtoCart Сбой ограничения NOT NULL: core_orderitem.item_id
я не знаю, что вызывает эту ошибку, может кто-нибудь может помочь <3.
Вам необходимо передать id или другое уникальное ограничение в теле запроса, чтобы вы могли определить, какой объект Item установить для экземпляра article, например:
{
"username": "admin",
"item_id": <id>,
"quantity": "1"
}
и в вашем методе post:
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()
# ...
Но я бы предложил вам использовать DRF Serializers для работы с request.data.