Ошибка drf возникла, когда я попытался запросить POST : Got a `TypeError` when calling `Item.objects.create()`.
Я попытался создать экземпляр Item. но каждый раз, когда я пытаюсь запросить POST, возникает ошибка типа как эта. Что мне делать? Пожалуйста, проверьте мою проблему.
Получили ошибку TypeError
при вызове Item.objects.create()
. Это может быть связано с тем, что в классе сериализатора есть поле, доступное для записи, которое не является допустимым аргументом для Item.objects.create()
. Вам может понадобиться сделать поле доступным только для чтения или переопределить метод ItemSerializer.create(), чтобы правильно обработать это.
TypeError: Item() получил неожиданный аргумент ключевого слова 'category'
models.py
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Category(models.Model):
NATIONAL_CHOICES = (
('outer', '아우터'),
('dress', '원피스'),
('top', '상의'),
('pants', '바지'),
('skirt', '스커트'),
('shoes', '신발'),
('accessory', '악세사리'),
)
big_category = models.CharField(max_length=20, choices=NATIONAL_CHOICES)
small_category = models.CharField(max_length=20)
class Item(models.Model):
user_id = models.ForeignKey(User, related_name='item_sets', on_delete=models.CASCADE)
category_id = models.ForeignKey(Category, related_name='item_sets', on_delete=models.DO_NOTHING)
description = models.TextField()
feature = models.TextField()
product_defect = models.TextField()
size = models.CharField(max_length=6)
wear_count = models.IntegerField()
price = models.IntegerField()
class Location(models.Model):
city = models.CharField(max_length=10)
gu = models.CharField(max_length=10)
dong = models.CharField(max_length=10)
class LocationSet(models.Model):
item_id = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='location_sets')
location_id = models.ForeignKey(Location, on_delete=models.CASCADE, related_name='location_sets')
class Photo(models.Model):
item_id = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='photo_sets')
photo = models.ImageField(upload_to='item_post', blank=True, null=True)
class StylePhoto(models.Model):
item_id = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='style_photo_sets')
user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='style_photo_sets')
photo = models.ImageField(upload_to='item_post', blank=True, null=True)
serializers.py
from rest_framework import serializers
from .models import *
User = get_user_model()
class PhotoSerializer(serializers.ModelSerializer):
class Meta:
model = Photo
fields = ['photo']
class StylePhotoSerializer(serializers.ModelSerializer):
class Meta:
model = StylePhoto
fields = ['photo']
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['big_category', 'small_category']
class ItemSerializer(serializers.ModelSerializer):
photos = PhotoSerializer()
style_photos = StylePhotoSerializer()
category = CategorySerializer()
class Meta:
model = Item
fields = [
'description',
'feature',
'product_defect',
'size',
'wear_count',
'price',
'category',
'photos',
'style_photos',
]
views.py
from rest_framework import generics
from .serializers import *
from django.contrib.auth import get_user_model
User = get_user_model()
class ItemListAPIView(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = ItemSerializer
class ItemDetailAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = ItemSerializer
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('post/', views.ItemListAPIView.as_view()),
path('post/<int:pk>/', views.ItemDetailAPIView.as_view()),
]
Когда вы хотите создать свой элемент, что вы отправили? Идентификатор или объект? Категория является внешним ключом в вашей модели Item, поэтому вам нужно отправить id для соответствия