ruby-on-rails Django模型在关系更新时更新相关对象

krcsximq  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(119)

Ruby on Rails有一个叫做touch的概念。
当你有通过外键链接的对象,并且你想有条件地更新的时候,这是很有帮助的,比如父对象的updated_at字段,每当子对象被更新的时候。这可以有效地用于俄罗斯娃娃缓存以及其他有用的东西。
根据Rails文档:

class Product < ApplicationRecord
  has_many :games
end

class Game < ApplicationRecord
  belongs_to :product, touch: true
end

touch设置为true时,任何更改游戏记录updated_at的操作也将更改相关产品的updated_at,从而使该高速缓存过期。
我试图在Django中找到一种等效的方法来实现这一点,但我还没有找到一个优雅的解决方案。如何在Game.updated_at被更改时强制更新Product.updated_at

class Product(models.Model):
    updated_at = models.DateTimeField()

class Game(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    updated_at = models.DateTimeField()

谢谢你!

qzwqbdag

qzwqbdag1#

通常的实现方法是覆盖.save()方法:

class Product(models.Model):
    updated_at = models.DateTimeField(auto_now=True)

class Game(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    updated_at = models.DateTimeField(auto_now=True)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if self.product:
            self.product.save()

请注意,添加auto_now=True将导致在保存示例时自动更新时间戳。

相关问题