price()缺少1个必需的位置参数:';自我';在Django Rest框架中尝试计算价格时

price()缺少1个必需的位置参数:';自我';在Django Rest框架中尝试计算价格时,django,api,django-rest-framework,save,postman,Django,Api,Django Rest Framework,Save,Postman,我试图创建一个案例,当我调用OrderCreateAPI时,价格将自动计算并保存在数据库中,但我在postman中得到了这个错误 错误:price()缺少1个必需的位置参数:“self 我的模型: class Order(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True) ordered_date = models.DateTimeField(aut

我试图创建一个案例,当我调用OrderCreateAPI时,价格将自动计算并保存在数据库中,但我在postman中得到了这个错误

错误:price()缺少1个必需的位置参数:“self

我的模型:

class Order(models.Model):
    
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)   
    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
  
def price(self):
    total_item_price = self.quantity * self.item.varaints.price
    return total_item_price

class OrderItem(models.Model):
    #user = models.ForeignKey(User,on_delete=models.CASCADE, blank=True
    #orderItem_ID = models.UUIDField(max_length=12, editable=False,default=str(uuid.uuid4()))
    orderItem_ID = models.CharField(max_length=12, editable=False, default=id_generator)
    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,default=price())

    ORDER_STATUS = (
        ('To_Ship', 'To Ship',),
        ('Shipped', 'Shipped',),
        ('Delivered', 'Delivered',),
        ('Cancelled', 'Cancelled',),
    )
    order_item_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')
此处,数量字段出现在OrderItem模型中,但价格出现在与产品模型相关的变量模型中,如下所示

我尝试过的事情:

class OrderItem(models.Model):   
    
 #total_item_price = models.PositiveIntegerField(blank=True,null=True,default=0) #commented out this field other fields are same as above


order_item_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')

@property
def price(self):
    return self.quantity * self.item.varaints.price

class OrderItemSerializer(serializers.ModelSerializer):    
    order = serializers.PrimaryKeyRelatedField(read_only=True)
    price = serializers.ReadOnlyField()
    class Meta:
        model = OrderItem
        fields = ['id','order','orderItem_ID','item','order_variants', 'quantity','order_item_status','price']
        # depth = 1
  • 我尝试删除price中的括号(),但得到了相同的错误
  • 若我试着把price函数放在类模型中total_itel_price字段之前,它会说self是price括号中必需的,若我把self,=放在price中,我不知道该放在price中(self=??)
  • 其他型号:

    Class Variants(models.Model):
        ...#other fields    
        price = models.DecimalField(decimal_places=2, max_digits=20,default=500)
    
    Class Product(models.Model):
        ...#other fields
        variants = models.ManyToManyField(Variants,related_name='products')
    
    我的序列化程序:

    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)
                
            else:
                raise serializers.ValidationError("This is not a customer account.Please login as customer.")
    
    更新代码:

    class OrderItem(models.Model):   
        
     #total_item_price = models.PositiveIntegerField(blank=True,null=True,default=0) #commented out this field other fields are same as above
    
    
    order_item_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')
    
    @property
    def price(self):
        return self.quantity * self.item.varaints.price
    
    class OrderItemSerializer(serializers.ModelSerializer):    
        order = serializers.PrimaryKeyRelatedField(read_only=True)
        price = serializers.ReadOnlyField()
        class Meta:
            model = OrderItem
            fields = ['id','order','orderItem_ID','item','order_variants', 'quantity','order_item_status','price']
            # depth = 1
    
    订单序列化程序与上面的一样。它包括OrderItemSerializer,如图所示:

    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']
    
    订单总价计算更新。

    这是我对total_price计算所做的,但是我没有在api响应中获得total_price字段,尽管没有错误

    class Order(models.Model):     
    .....#same fields as above
    
        @property
        def total_order_price(self):
            return sum([_.price for _ in self.order_items_set.all()])
    
    我在OrderItem模型中使用了price函数,我的OrderItem实例是OrderItems。有什么问题吗???

    试试这个

    class Order(models.Model):
        """Stores the details of the order"""
    
        user: User = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
        ordered_date = models.DateTimeField(auto_now_add=True)
        ordered = models.BooleanField(default=False)
        # billing_details = models.OneToOneField('BillingDetails',on_delete=models.CASCADE,null=True,blank=True,related_name="order")
    
        def __str__(self) -> str:
            return self.user.email
    
        @property
        def total_price(self) -> int:
            """
            Dropped the total price field and created it as property
            This is not the best practice, I am leaving that as practice for you :)
            """
            return sum([_.total_item_price for _ in self.orderitem_set.all()])
    
    
    class OrderItem(models.Model):
        """Order Item stores the details of the each order item"""
    
        orderItem_ID: str = models.CharField(
            max_length=12, editable=False, default=id_generator
        )
        order: Order = models.ForeignKey(
            Order,
            on_delete=models.CASCADE,
            blank=True,
            null=True,
            related_name="order_items",
        )
        item: Product = models.ForeignKey(
            Product, on_delete=models.CASCADE, blank=True, null=True
        )
        order_variants: Variants = models.ForeignKey(
            Variants, on_delete=models.CASCADE, blank=True, null=True
        )
        quantity: int = models.IntegerField(default=1)
        price = models.PositiveIntegerField()
    
        @property
        def total_item_price(self):
            """
            Calculates total item price for the item
            Here you can also add additional logics such as
            taxes per item etc
    
            """
    
            return self.price * self.quantity
    
        ORDER_STATUS = (
            ("To_Ship", "To Ship"),
            ("Shipped", "Shipped"),
            ("Delivered", "Delivered"),
            ("Cancelled", "Cancelled"),
        )
        order_item_status = models.CharField(
            max_length=50, choices=ORDER_STATUS, default="To_Ship"
        )
    
    

    此代码最终用于OrderItem价格计算:

    class OrderItem(models.Model): 
    .....#fields same as above
        #total_item_price = models.PositiveIntegerField(blank=True,null=True,default=0)
    
        ORDER_STATUS = (
            ('To_Ship', 'To Ship',),
            ('Shipped', 'Shipped',),
            ('Delivered', 'Delivered',),
            ('Cancelled', 'Cancelled',),
        )
        order_item_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')
    
        @property
        def price(self):
            total_item_price = self.quantity * self.order_variants.price
            return total_item_price
    

    变体中有一个输入错误。此外,我应该使用order_变量而不是item.variants,因为item有许多变量,但用户只选择一个具有唯一价格的变量。

    将order类中的价格函数定义为类方法。我已经用我尝试过的方法更新了我的问题。我已经将函数放在模型类中,但是它说从函数调用传递self。我还得把self=somthing放进去。但是我不知道该放什么。在你的问题中,你在类外定义了price函数。是的,但我尝试放在类内,并得到了相同的错误。你的
    price(self)
    方法应该在
    OrderItem
    类内。由于该方法在类之外,它希望传递
    self
    参数。并更改参数
    default=price()
    total\u item\u price
    inside
    OrderItem
    类的
    default=price
    属性。您不认为
    price
    方法应该在
    OrderItem
    类中,因为
    Order
    类没有
    quantity
    item
    中所需的属性吗
    price
    method.Ah@Kishore,接得好我没查密码。让我更新答案。你好@VJMagar我厌倦了你的代码,但它是我的调用后api,我得到的reuslts是price=0。虽然没有错误,但已创建订单。我检查了物品的价格,它是500。@SarojPaudel你能试试更新代码吗?所以,总的物品价格不需要保存在数据库中??不同的产品来自不同的供应商,所以我想我将来也需要总的商品价格。