Python Django REST API';s适用于带有外键的车型';s
我想用DRF构建一个API来查看购物车。它在非API版本中工作,但我在序列化程序中发现一个错误,即模型中不存在字段 models.pyPython Django REST API';s适用于带有外键的车型';s,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想用DRF构建一个API来查看购物车。它在非API版本中工作,但我在序列化程序中发现一个错误,即模型中不存在字段 models.py class Product(models.Model): title = models.CharField(max_length=50, blank=False) cover_image = models.ImageField(upload_to='products/') summary = models.TextField()
class Product(models.Model):
title = models.CharField(max_length=50, blank=False)
cover_image = models.ImageField(upload_to='products/')
summary = models.TextField()
description = models.TextField()
price = models.DecimalField(max_digits=6, decimal_places=2)
def __str__(self):
return self.title
class Cart(models.Model):
user = models.ForeignKey(User)
active = models.BooleanField(default=True)
order_date = models.DateField(null=True)
def __str__(self):
return self.user.username
class Order(models.Model):
product = models.ForeignKey(Product)
cart = models.ForeignKey(Cart)
quantity = models.IntegerField(default=1)
def __str__(self):
return self.product.title
views.py
def cartview(request):
if request.user.is_authenticated():
cart = Cart.objects.filter(user=request.user, active=True)
orders = Order.objects.filter(cart=cart)
total = 0
count = 0
for order in orders:
total += (order.product.price * order.quantity)
count += order.quantity
context = {
'total': total,
'cart': orders,
'count': count,
}
return render(request, 'store/cart.html', context)
else:
return redirect('index:index')
api/views.py
class CartAPIView(ListAPIView):
permission_classes = [IsAuthenticated]
serializer_class = CartSerializer
def get_queryset(self, **kwargs):
cart = Cart.objects.filter(user=self.request.user, active=True)
orders = Order.objects.filter(cart=cart)
total = 0
count = 0
for order in orders:
total += (order.product.price * order.quantity)
count += order.quantity
context = {
'total': total,
'cart': orders,
'count': count,
}
return context
序列化程序.py
class CartSerializer(ModelSerializer):
class Meta:
model = Cart
fields = [
'title',
'cover_image',
'summary',
'price',
]
我发现此错误字段名标题
对型号购物车
无效
我在模板视图中获取项目,但在api视图中没有。那么我应该在这里做什么呢?您的购物车模型没有字段或方法
Title
,但您已将其包含在字段列表中。您只能序列化模型上存在的字段或方法,或创建显式链接的字段或方法
您在模板中获得产品标题,因为您正在返回
orders=Order.objects.filter(cart=cart)
。您在模板中显示的Order
对象字符串方法是return self.product.title
——因此您要从Order对象转到相应的产品(一个连接)并获取该对象的title属性
要在序列化程序中执行同样的操作,需要为每个对象定义一个序列化程序,然后嵌套它们
class CartSerializer(ModelSerializer):
class Meta:
model = Cart
fields = [
'title',
'cover_image',
'summary',
'price',
]
class ProductSerializer(ModelSerializer):
class Meta:
model = Product
...etc...
class OrderSerializer(ModelSerializer):
class Meta:
model = Order
product = ProductSerializer
...etc...
您的购物车模型没有字段或方法
Title
,但您已将其包含在字段列表中。您只能序列化模型上存在的字段或方法,或创建显式链接的字段或方法
您在模板中获得产品标题,因为您正在返回
orders=Order.objects.filter(cart=cart)
。您在模板中显示的Order
对象字符串方法是return self.product.title
——因此您要从Order对象转到相应的产品(一个连接)并获取该对象的title属性
要在序列化程序中执行同样的操作,需要为每个对象定义一个序列化程序,然后嵌套它们
class CartSerializer(ModelSerializer):
class Meta:
model = Cart
fields = [
'title',
'cover_image',
'summary',
'price',
]
class ProductSerializer(ModelSerializer):
class Meta:
model = Product
...etc...
class OrderSerializer(ModelSerializer):
class Meta:
model = Order
product = ProductSerializer
...etc...
您的购物车模型没有名为title的字段,这就是它引发错误的原因。可能您在serializer类中有一个错误,而不是使用model=Cart(在Meta子类中),您应该使用model=Product。我认为这将解决问题。我看到get_queryset()方法应该返回queryset对象,我猜。这个错误很明显,您正在尝试序列化没有title属性的购物车模型。你应该重新考虑这个方法。另请参见自动化Web API开发您的购物车模型没有名为title的字段,这就是它引发错误的原因。可能您在serializer类中有一个错误,而不是使用model=Cart(在Meta子类中),您应该使用model=Product。我认为这将解决问题。我看到get_queryset()方法应该返回queryset对象,我猜。这个错误很明显,您正在尝试序列化没有title属性的购物车模型。你应该重新考虑这个方法。另请参见自动化Web API开发,我确实在()这个链接中尝试过。仍然会出现相同的错误。如果看不到其他序列化程序,很难说您做了什么。但正如所提供的,您的CartSerializer永远不会工作;您没有该字段。此外,如果您遇到相同的错误,那么您还没有从字段列表中删除“title”。在我自己的环境中刚刚将其组合在一起,这似乎是可行的。你改变了什么?我在这个链接上试过了。仍然会出现相同的错误。如果看不到其他序列化程序,很难说您做了什么。但正如所提供的,您的CartSerializer永远不会工作;您没有该字段。此外,如果您遇到相同的错误,那么您还没有从字段列表中删除“title”。在我自己的环境中刚刚将其组合在一起,这似乎是可行的。你改变了什么?