【问题标题】:Item id and order_variants id stored as null while creating an order in django rest framework在 django rest 框架中创建订单时,项目 id 和 order_variants id 存储为 null
【发布时间】:2021-06-24 14:19:03
【问题描述】:

我创建了一个订单创建 API,通过同时创建订单项目对象和账单明细对象来创建订单。几天前一切正常,但是当我今天尝试从邮递员调用订单 api 时,项目 ID 和 order_variants 在数据库中存储为 null,尽管我传递项目 ID 和变体 ID 并且对象也存在.

我正在发送这样的原始 JSON 数据。

如上所示,我已发送商品 id 和 order_varints id。但是我得到的结果是null,如下所示。

我的模型:

class Order(models.Model):
    ORDER_STATUS = (
        ('To_Ship', 'To Ship',),
        ('Shipped', 'Shipped',),
        ('Delivered', 'Delivered',),
        ('Cancelled', 'Cancelled',),
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    #items = models.ManyToManyField(OrderItem,blank=True, null=True,related_name="order_items")
    #start_date = models.DateTimeField(auto_now_add=True)
    order_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')

    ordered_date = models.DateTimeField(auto_now_add=True)
    ordered = models.BooleanField(default=False)
    total_price = models.CharField(max_length=50,blank=True,null=True)
    #billing_details = models.OneToOneField('BillingDetails',on_delete=models.CASCADE,null=True,blank=True,related_name="order")

    def __str__(self):
        return self.user.email 

class OrderItem(models.Model):
    #user = models.ForeignKey(User,on_delete=models.CASCADE, blank=True)
    order = models.ForeignKey(Order,on_delete=models.CASCADE, blank=True,null=True,related_name='order_items')
    item = models.ForeignKey(Product, on_delete=models.CASCADE,blank=True, null=True)
    order_variants = models.ForeignKey(Variants,on_delete=models.CASCADE,blank=True,null=True)
    quantity = models.IntegerField(default=1)    
    total_item_price = models.PositiveIntegerField(blank=True,null=True,)
    

    def __str__(self):
        return f"{self.quantity} items of {self.item} of {self.order.user}"

    class Meta:
        verbose_name_plural = "Cart Items"
        ordering = ('-id',)

class BillingDetails(models.Model):
    
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    order = models.OneToOneField(Order, on_delete=models.CASCADE, blank=True, null=True, related_name='billing_details')
    first_name = models.CharField(max_length=50,blank=True,null=True)
    last_name = models.CharField(max_length=50, blank=True, null=True)
    email = models.EmailField(blank=True, null=True)
    phone = models.CharField(max_length=50,blank=True,null=True)    
    city = models.CharField(max_length=50,blank=True,null=True)
    address = models.CharField(max_length=100,blank=True,null=True)

我的看法:

class AddtoOrderItemView(ListCreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

我的序列化器:

class OrderSerializer(serializers.ModelSerializer):

    billing_details = BillingDetailsSerializer()
    order_items = OrderItemSerializer(many=True)
    user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
    class Meta:
        model = Order
        fields = ['id','user','ordered_date','order_status', 'ordered', 'order_items', 'total_price','billing_details']
        # depth = 1    

    def create(self, validated_data):
        user = self.context['request'].user
        if not user.is_seller:
            order_items = validated_data.pop('order_items')
            billing_details = validated_data.pop('billing_details')
            order = Order.objects.create(user=user,**validated_data)
            BillingDetails.objects.create(user=user,order=order,**billing_details)
            for order_items in order_items:
                OrderItem.objects.create(order=order,**order_items)
        
        return order
    else:
        raise serializers.ValidationError("This is not a customer account.Please login as customer')
   

【问题讨论】:

    标签: json django api django-rest-framework postman


    【解决方案1】:

    一切似乎都很好。我发现这里唯一犯规的是

    for order_items in order_items:
        OrderItem.objects.create(order=order,**order_items)
    

    我猜这应该可以解决问题

    for order_item in order_items:
        OrderItem.objects.create(order=order,**order_item)
    

    【讨论】:

    • **order_item 没有任何意义。如果我只使用order_item,下面会出现红线。
    【解决方案2】:

    这是因为分配给 OrderItemSerializer 的深度 = 1。如果删除,它将正常工作。

    我更新的序列化程序:

    class OrderItemSerializer(serializers.ModelSerializer):    
        class Meta:
            model = OrderItem
            fields = ['id','item','order_variants','order', 'quantity','order_item_status','total_item_price']
            # depth = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多