如果 ManyToManyField 为空,则删除"items"



我有订单部分,我的模型如下:

class OrderItem(models.Model):
product = models.ForeignKey(Stock, on_delete=models.SET_NULL, null=True)
is_ordered = models.BooleanField(default=False)
date_added = jmodels.jDateField(auto_now=True)
date_ordered = jmodels.jDateField(null=True)
quantity = models.IntegerField(default=0, verbose_name='quantity')
class Order(models.Model):
ref_code = models.CharField(max_length=15)
owner = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
is_ordered = models.BooleanField(default=False)
items = models.ManyToManyField(OrderItem, related_name='item')
date_ordered = jmodels.jDateField(auto_now=True,null=True)
created_on_time = models.TimeField(auto_now_add=True,null=True)
def get_cart_items(self):
return self.items.all()
def get_cart_total(self):         
return sum([item.quantity*item.product.price for item in self.items.all()])

我的问题是,当我在购物车中删除所有项目时,项目变为空,但订单仍然存在于我的数据库中。如果项目为空,我希望整个订单将被删除。

选项1:在订单上使用信号m2m_changed

from django.db.models.signals import m2m_changed
@receiver(m2m_changed, sender=Order)
def m2m_change_order(sender, instance, created, **kwargs):
if not instance.items.exist():
instance.delete()

它将自检并自毁

选项2:使用信号postrongave OrderItem

在模型OrderItem上,将postrongave触发器设置为如下

from django.db.models.signals import post_save
@receiver(post_save, sender=OrderItem)
def post_save_order_item(sender, instance, created, **kwargs):
order_list = Order.objects.filter(items=None)
for order in order_list:
order.delete()

基本上,每次删除OrderItem时,它都会在Order表中查找任何没有项目的订单

最新更新