【问题标题】:How do I manage stateful data for database objects in Django/Python?如何在 Django/Python 中管理数据库对象的有状态数据?
【发布时间】:2018-01-11 04:37:00
【问题描述】:

在一个项目中,我必须处理大量订单(如购买)数据。一起 使用订单数据,我必须以某种方式生成状态信息 被缓存。我不确定管理此类数据的好方法。

型号

class Order:
  buyer_name = TextField()

class OrderItem:
  order = ForeignKey(Order)
  quantity = IntegerField()
  name = TextField()

要求

  • 正在通过查看字符来检查买家名称的有效性 并查询外部 API。
  • 还检查是否有来自同一买家的多个订单(→ 重复)。
  • 用户必须能够根据他们的检查结果过滤订单。
  • 最后但并非最不重要的一点是,每个订单都有一个直接依赖的条件 关于检查结果:

    • 买家姓名有效,无重复订单:订单条件OK。
    • 买家姓名有效,重复订单:订单条件为警告。
    • 买家姓名无效:订单条件错误。

问题

我的问题:存储条件或信息等信息的好方法是什么? 检查结果?

我可能还需要查询每个订单的总数量 始终加入和汇总项目数量(性能)。

【问题讨论】:

  • 你为什么不把那些“检查结果”和状态存储在订单中???
  • @brunodesthuilliers 我就是这样做的,但感觉不对。我还需要订单总数等数据。存储总计本身和用于计算总计的订单项,感觉很奇怪。
  • 为什么你觉得它感觉不对? StateOrder 的属性。这并不意味着它必须存储在数据库中。
  • @cezar 因为我必须让 Order.total 与基础数据保持同步,我觉得这在某种程度上表明存在设计缺陷。我不知道其他人是怎么做的,这就是我问的原因。 ;-) 如果它不在数据库中,则很难/不可能查询它,我想这是个问题。
  • 如果 Order 有一些 State,这是使用其他可用数据计算的,您可以将其设为所谓的虚拟属性。我将通过一个简单的示例发布答案。

标签: python django database caching


【解决方案1】:

据我了解您的问题,您的模型有一个属性一直在变化,可以使用存储在数据库中的数据进行计算。简单的例子是一个类PersonPerson 类具有 name、date_of_birth、place_of_birth 等属性。超过该年龄也是 Person 的属性。但是我们不会将该属性保存在数据库中,因为它会根据其他因素(date_of_birth 和现在)动态变化。它可能看起来像这样:

class Person(models.Model):
    name = models.CharField(max_length=100, unique=True)
    date_of_birth = models.DateField()
    place_of_birth = models.CharField(max_length=60)

    def __str__(self):
        return self.name

    @cached_property
    def age(self):
        # get today's date (for example using timezone.now())
        # and calculate the age today - date_of_birth
        # return the age in years as integer
        return age

现在您可以在任何地方使用该属性,它被缓存并且不再进行数据库查询。

比在你的模板中你可以这样做:

{% extend "base.html" %}
<p>{{ person.name }} is {{ person.age }} years old.</p>

我希望这能给您一个想法,并且您可以针对您的特定情况进行解决。你也可以使用装饰器@property,但是Django 的@cached_property 给了你更多的可能性,比如缓存。 你可以像这样导入它:

from django.utils.functional import cached_property

【讨论】:

  • 这很好,但是一个要求是我能够查询数据库中的缓存数据——所以它确实必须以某种方式存在于数据库级别。但是@cached_property 对于我项目中的其他部分来说非常有趣。
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2011-10-31
  • 2021-08-15
  • 2010-10-13
  • 2020-03-08
相关资源
最近更新 更多