繁体   English   中英

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

[英]How do I manage stateful data for database objects in Django/Python?

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

楷模

class Order:
  buyer_name = TextField()

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

要求

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

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

问题

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

我可能还必须查询每个订单的总数量计数,而不能一直保持联接和汇总项目数量(性能)。

据我了解您的问题,模型的属性一直在变化,可以使用数据库中存储的数据进行计算。 一个简单的例子是一个Person类。 Person类具有诸如name,date_of_birth,place_of_birth等属性,此外,age也是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM