Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST API';s适用于带有外键的车型';s_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django REST API';s适用于带有外键的车型';s

Python 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()

我想用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()
    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”。在我自己的环境中刚刚将其组合在一起,这似乎是可行的。你改变了什么?