【问题标题】:Django: Update Model-Field everytime a Foreign-Key is associated with said model?Django:每次外键与所述模型相关联时更新模型字段?
【发布时间】:2019-05-29 14:03:41
【问题描述】:

假设我们有以下类:

class Cart(models.Model):
      total = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)

class CartItem(models.Model):
      cart = models.ForeignKey(Cart, related_name='items', on_delete=models.CASCADE)

我想每次将购物车项目添加到购物车时更新总数。何时/如何在此处调用我的 addItUp() 方法?

考虑过使用这样的信号,但这不会触发:

@receiver(post_save, sender=CartItem, weak=False)
def post_save_cartItem_receiver(sender, instance, *args, **kwargs):
    print("inside signal")

这是我非常简化的 addToCart() 方法:

    def add(self, request, product_id, cart_obj):
        product = get_object_or_404(Product, id=product_id)
        CartItem.objects.create(cart=cart_obj, ...)
        cart_obj.save()
        return True

这是我的第一个问题,如果我能更好地解释,请告诉我。

【问题讨论】:

    标签: python django django-models foreign-keys


    【解决方案1】:

    欢迎使用 StackOverflow。

    人们在创建触发器时遇到的一个常见问题是他们忘记(或不知道)在他们的apps.py 文件中导入信号。这是我能想象到您的信号不会触发的唯一原因。

    我想您的 apps.py 文件应该类似于(如果您的应用名称是 Shop):

    from django.apps import AppConfig
    
    class ShopConfig(AppConfig):
        name = 'Shop'
    
        def ready(self):
            import Shop.signals
    

    然后您可以使用 CartItem 的 post_save 信号来获取其相关的购物车,将总值相加,并使用新的总数保存购物车。

    【讨论】:

    • 哇哦!这是人们在使用信号时往往会错过的一件事。信号非常有用,玩得开心
    猜你喜欢
    • 2012-12-24
    • 2013-11-09
    • 2017-12-28
    • 2020-08-03
    • 2022-10-16
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多