d之后存在Django相关字段

2024-05-16 04:10:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个订单模型和其他与之相关的模型。用户可以删除这些项目中的任何一个,我必须检查删除后订单是否为空,如果为真,则设置为active False。一些基本的代码来说明它

class Order(models.Model):
    paid = models.BooleanField(default=False)
    active = models.BooleanField(default=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

    def empty_order():
         """
         I must implement it
         """

class HomeOrder(models.Model):
    ...
    order = models.OneToOneField(Order, related_name='primary_home')

class TourOrder(models.Model):
    ...
    order = models.ForeignKey(Order, related_name='tours')

我有一个post\u delete signals,它连接到与订单相关的每个模型:

post_delete.connect(delete_order_if_empty, sender=HomeOrder)
post_delete.connect(delete_order_if_empty, sender=TourOrder)

def delete_order_if_empty(sender, instance, **kwargs):
    if instance.order.empty_order():
        instance.order.active = False
        instance.order.save()

一个订单可以有一个家,所以如果家存在,我可以做order.primary\u主页如果家不存在,它将引发AttributeError,因为它是一个OneToOne关系。你知道吗

一个订单可以有很多行程,所以在空订单方法中,我想做如下检查。你知道吗

def empty_order():
    home = hasattr(self, 'primary_home')  # Avoid AttributeError exception
    tours = self.tours.exists()
    this_order_has_something = primary_home or tours
    return not this_order_has_something

现在,当我删除一个同胚序时,信号被触发,但是空的方法从未意识到这个同胚序不再存在。示例:

>>>o=Order.objects.create(...)
>>>o.primary_home # raise AttributeError
>>>h=HomeOrder.objetcs.create(order=o, ...)
>>>o.primary_home  # <HomeOrder: home-xx>
>>>h.delete()
>>>o.primary_home # still <HomeOrder: home-xx> Why?
>>>o.refresh_from_db()   
>>>o.primary_home # again <HomeOrder: home-xx>

Tags: instance订单模型falsehomeifmodelsorder