【发布时间】:2021-07-30 08:12:20
【问题描述】:
我有一个模型(积分),它根据用户的购买来保存积分。我的做法是,在下订单时(调用 orderapi),通过订单实例传递一个信号,并根据金额计算点数,并使用 save 方法保存。
创建了 Alothugh Order 对象,我没有看到保存在数据库中的点。我不确定是什么问题。
我的模型:
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)
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)
@property
def total_price(self):
# abc = sum([_.price for _ in self.order_items.all()])
# print(abc)
return sum([_.price for _ in self.order_items.all()])
def __str__(self):
return self.user.email
class Meta:
verbose_name_plural = "Orders"
ordering = ('-id',)
class OrderItem(models.Model):
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)
@property
def price(self):
total_item_price = self.quantity * self.order_variants.price
# print(total_item_price)
return total_item_price
class Points(models.Model):
order = models.OneToOneField(Order,on_delete=models.CASCADE,blank=True,null=True)
points_gained = models.IntegerField(default=0)
def collect_points(sender,instance,created,**kwargs):
total_price = instance.total_price
if created:
if total_price <= 10000:
abc = 0.01 * total_price
else:
abc = 0.75 * total_price
return abc
post_save.connect(collect_points,sender=Order)
def save(self,*args,**kwargs):
self.points_gained = self.collect_points()
super(Points, self).save(*args, **kwargs)
我实际上在这里感到困惑。我们可以使用 instance.total_price 访问属性 total_price 吗?
我的序列化器:
class OrderSerializer(serializers.ModelSerializer):
billing_details = BillingDetailsSerializer()
order_items = OrderItemSerializer(many=True)
user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
#total_price = serializers.SerializerMethodField(source='get_total_price')
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)
order.save()
return order
else:
raise serializers.ValidationError("This is not a customer account.Please login as customer.")
我的更新代码:
class Order(models.Model):
total_price = models.FloatField(blank=True,null=True)
def final_price(self):
return sum([_.price for _ in self.order_items.all()])
def save(self, *args, **kwargs):
self.total_price = self.final_price()
super(Order, self).save(*args, **kwargs)
class Points(models.Model):
order = models.OneToOneField(Order,on_delete=models.CASCADE,blank=True,null=True)
points_gained = models.FloatField(default=0)
def collect_points(sender,instance,created,**kwargs):
total_price = instance.total_price
print(total_price)
if created:
if total_price <= 10000:
abc = 0.01 * total_price
else:
abc = 0.75 * total_price
new_point = Points.objects.create(order=instance, points_gained=abc)
post_save.connect(collect_points,sender=Order)
专注于这部分
Class Order(models.Model):
total_price = models.FloatField(blank=True,null=True)
def final_price(self):
# abc = sum([_.price for _ in self.order_items.all()])
# print(abc)
return sum([_.price for _ in self.order_items.all()])
def save(self, *args, **kwargs):
self.total_price = self.final_price()
super(Order, self).save(*args, **kwargs)
【问题讨论】:
标签: django api django-rest-framework save django-signals