实现第一个序列化程序时出错:'QuerySet'对象没有属性'name'



我刚刚为项目的电子商务页面构建了一个Item(产品(模型,一个返回单个项目的ItemDetailsView和一个用于创建/检索/更新/删除的ItemApiView。当我请求获取ItemApiView时,我希望它能返回数据库中项目的完整列表。然而,我得到了以下错误:

AttributeError: Got AttributeError when attempting to get a value for field `name` on serializer `ItemSerializer`. The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance. Original exception text was: 'QuerySet' object has no attribute 'name'.

"name";是我的项目模型中的字段。以下是完整型号:

class Item(BaseModel):
"""
Item that can be purchased
"""
name = models.CharField(max_length=150)
description = models.TextField(blank=True)
price = models.DecimalField(max_digits=4, decimal_places=2)
image = models.ImageField(upload_to="images/", default="images/default.png")
category = models.ForeignKey(Category, on_delete=models.PROTECT, null=True)
is_active = models.BooleanField(default=True)
quantity = models.IntegerField(null=True, blank=True, default=0)
discount = models.FloatField(default=0.0)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
verbose_name_plural = "Products"
ordering = ("-created",)
def get_absolute_url(self):
return reverse("store:product_detail", args=[self.slug])
def __str__(self):
return "{}".format(self.name)

这是ItemApiView。只有";获取"方法对应于我的具体问题,但我包含了完整的视图,因为我对我尚未测试的放置/发布/删除方法持开放态度:

class ItemApiView(APIView):
"""
API endpoint to retrieve, create and update
"""
@limits(settings.RATE_LIMIT_REQUESTS, settings.RATE_LIMIT_DURATION)
def get(self, request):
"""Return all items"""
print("request", request)
try:
items = Item.objects.all()
serialized_data = ItemSerializer(items)
except:
return Response({"message": "No items exist"}, status=status.HTTP_404_NOT_FOUND)
return Response(serialized_data.data)
@limits(settings.RATE_LIMIT_REQUESTS, settings.RATE_LIMIT_DURATION)
def put(self, request):
"""Update item info"""
item_id = request.data["item_id"]
try:
item = Item.objects.get(id=item_id),
id=request.data["id"],
name=request.data["name"],
price=request.data["price"],
is_active=request.data["is_active"],
description=request.data["description"],
discount=request.data["discount"],
image=request.data["image"],
quantity=request.data["quantity"],
category=request.data["category"],
except Item.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if item.name != name:
item.name = name
elif item.description != description:
item.description = description
elif item.price != price:
item.price = price
elif item.is_active != is_active:
item.is_active = is_active
elif item.discount != discount:
item.discount = discount
elif item.quantity != quantity:
item.quantity = quantity
elif item.category != category:
item.category = category
item.save()
return Response(ItemSerializer(item).data)
def delete(self, request):
"""Delete item"""
item_id = request.data["item_id"]
try:
item = Item.objects.get(id=item_id)
except Item.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
item.delete()
return Response(status=status.HTTP_200_OK)
@limits(settings.RATE_LIMIT_REQUESTS, settings.RATE_LIMIT_DURATION)
def post(self, request):
"""Create item"""
item = Item.objects.create(
id=request.data["id"],
name=request.data["name"],
price=request.data["price"],
is_active=request.data["is_active"],
description=request.data["description"],
discount=request.data["discount"],
image=request.data["image"],
quantity=request.data["quantity"],
category=request.data["category"]
)
Event.objects.create(
user=user,
event_type=Event.ITEM_CREATE,
payload={
"id": item.id,
"name": item.name,
"price": item.price,
"is_active": item.is_active,
"description": item.description,
"discount": item.discount,
"image": item.image,
"quantity": item.quantity,
"category": item.category,
},
)
return Response(ItemSerializer(item).data)

最后是ItemSerializer:

class ItemSerializer(serializers.ModelSerializer):
"""
Item Serializer
"""
class Meta:
model = Item
fields = "__all__"

在创建列表序列化程序时,尝试添加many=True

class ItemApiView(APIView):
...
def get(self, request):
...
try:
items = Item.objects.all()
serialized_data = ItemSerializer(items, many=True)
...

最新更新