正在尝试基于TypeError创建新对象:ItemSerializer类型的对象不可JSON序列化-



我试图从api中获取数据,并用它创建一个新项。我收到一个错误:]文件"/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/encoder.py";,第179行,默认raise TypeError(f'类型为{o..名称}的对象'TypeError:Item类型的对象不是JSON可序列化的

型号

# Create your models here.
class Item(models.Model):
"""Make scan class"""
# define fields
# https://docs.djangoproject.com/en/3.0/ref/models/fields/
name = models.CharField(max_length=100, unique=True)
recycleable = models.BooleanField()
description = models.CharField(max_length=100)
owner = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE
)
barcode = models.CharField(max_length=100, unique=True)
def __str__(self):
# This must return a string
return f"The item named '{self.name}' is {self.description}. It is {self.recycleable} that it is recycleable."
def as_dict(self):
"""Returns dictionary version of Item models and stuff"""
return {
'id': self.id,
'name': self.name,
'recycleable': self.recycleable,
'description': self.description,
'owner': self.owner,
'barcode': self.barcode,
}

查看

class ScanApiDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes=(IsAuthenticated,)
def get(self, request, slug):
"""Show request"""
load_dotenv(find_dotenv())
api_key = os.environ.get("API_KEY")
# Locate the scan to show
response = requests.get(f"https://api.barcodelookup.com/v2/products?barcode={slug}&formatted=y&key={api_key}")
if response:
print(response, "my response")
item = response.json()
for i in range(len(item)):
descrip =  item['products'][i]['description']
name = item['products'][i]['product_name']
barcode = item['products'][i]['barcode_number']
recycleable = True
x = re.search("^Material", descrip)
owner = request.user.id
data = Item(id, name, recycleable, descrip, owner, barcode)
print(type(data), "the data")
json_data = json.dumps(data)
print(json_data)
# # Serialize/create item
item = ItemSerializer(data=json_data)
# print(item, "item after serializer")
# # If the item data is valid according to our serializer...
if item.is_valid():
print(item.data)
item.save()
if item:
return Response({'item': item}, status=status.HTTP_200_OK)
else:
errors = "No item found"
return Response(errors, status=status.HTTP_400_BAD_REQUEST)

串行器

class ItemSerializer(serializers.ModelSerializer):
# owner = serializers.StringRelatedField()
class Meta:
model = Item
fields = ('id', 'name', 'recycleable', 'description', 'owner', 'barcode')

所以,您在这里做了一些逻辑错误

item = ItemSerializer(data=json_data)

在这段代码上面,您已经将项分配为一些json值,但在if块中,您必须再次将此变量分配为序列化程序,在这里是

if item:
return Response({'item': item}, status=status.HTTP_200_OK)

根据我的说法,您认为项是json值,但它是一个serializer实例。

因此,您可以将item = ItemSerializer(data=json_data)指定为item_serializer = ItemSerializer(data=json_data)或除item之外的任何其他变量。

我认为这可以解决你的问题

最新更新