如何在Django / Python中管理数据库对象的有状态数据?

时间:2017-08-03 14:00:39

标签: python django database caching

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

模型

class Order:
  buyer_name = TextField()

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

要求

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

    • 买方名称有效,无重复订单:订单条件正常。
    • 买方名称有效,重复订单:订单条件为警告。
    • 买方名称无效:订单条件为错误。

问题

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

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

1 个答案:

答案 0 :(得分:1)

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

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