【问题标题】:Data synchronization issue with DjangoDjango 的数据同步问题
【发布时间】:2013-08-22 16:11:37
【问题描述】:

我有以下models.py

class BagOfApples(models.Model):
    quantity = models.PositiveSmallIntegerField(default = 0)

让我们创建一个“苹果袋”对象并在其中放入一个“苹果”:

>>> from myapp import models
>>> 
>>> models.BagOfApples().save()
>>> 
>>> bag1 = models.BagOfApples.objects.get(pk = 1)
>>> bag2 = models.BagOfApples.objects.get(pk = 1)
>>> 
>>> bag1.quantity += 1
>>> bag1.save()
>>> 
>>> bag1.quantity
1
>>> bag2.quantity
0

有没有办法自动重新加载bag2变量中的数据?

在我的实际应用程序中,事情比这要复杂一些,相同的对象在被不同的数据库查询检索到后,可以在代码的不同部分进行修改。这甚至不是故意的(例如,这个问题发生在我身上,因为 Django 缓存了 OneToOne 或 ForeignKey 关系的结果)。

拥有某种管理器(也许中间件可以做到这一点?)来跟踪相同的对象会非常有帮助。

在此示例中,管理器会自动检测到 bag2 实际上是 bag1,并且不会执行第二个查询,而只是返回 bag1

如果没有很好的方法来做到这一点,任何其他关于更好的应用程序设计的有用提示将不胜感激。

【问题讨论】:

    标签: django django-models django-database


    【解决方案1】:

    关键是要了解您的查询实际执行的时间。每次您要访问其模型字段之一时,模型对象都不会重复查询。

    为了避免保留带有陈旧数据的对象,我会确保在我真正需要数据时进行查询。在您的示例中,我会保留您知道不会改变的信息(pk 值),并在您需要具有新值的对象时执行 get。

    from myapp import models
    models.BagOfApples().save()
    
    bag1 = models.BagOfApples.objects.get(pk = 1)
    
    bag1.quantity += 1
    bag1.save()
    
    print bag1.quantity  # will print 1
    
    bag2 = models.BagOfApples.objects.get(pk = 1)
    print bag2.quantity  # will print 1 too
    

    【讨论】:

    • 感谢马特的回复。我的问题是 Django 正在缓存 ForeignKey 关系,我通过强制 Django 在每次访问关系时进行查询来解决这个问题。所以我现在不使用my_model = object.foreign_model,而是使用my_model = ForeignModel.objects.get(pk = object.foreign_model_id)。这正是您的建议(“……当我真正需要数据时,我会确保查询”)。但是,它并没有真正回答我的问题。能够尽可能从缓存中受益,同时避免陈旧数据,这将是一件好事。
    猜你喜欢
    • 2011-10-21
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多