2017-08-03 71 views
0

在一個項目中,我必須處理大量的訂單(如購買)數據。一起 與訂單數據,我必須生成狀態信息,以某種方式必須緩存 。我不確定管理這些數據的好方法。如何在Django/Python中管理數據庫對象的有狀態數據?

模型

class Order: 
    buyer_name = TextField() 

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

要求

  • 買方名正在看人物 和查詢外部API進行有效性檢查。
  • 還檢查是否有多個來自同一買方的訂單(→ 重複項)。
  • 用戶必須能夠根據檢查結果過濾訂單。
  • 最後,但並非最不重要,每個訂單都有這直接檢查結果取決於 條件:

    • 買家名稱是有效的,沒有重複的順序:訂單狀況確定。
    • 買家名稱有效,重複順序:訂單條件爲警告。
    • 買方名稱無效:訂單條件爲錯誤。

問題

我的問題:什麼是存儲信息,如條件或 檢查結果的好方法?

我可能還需要查詢每個訂單的總數量,而無需 隨時連接並彙總項目數量(性能)。

+1

爲什麼你不只是存儲這些「檢查結果」,並在秩序狀態? –

+0

@brunodesthuilliers這就是我所做的,但它感覺不對。我還需要數據,如訂單總計。存儲總量本身和用於計算總量的訂單項目,感覺很奇怪。 – stschindler

+0

你爲什麼覺得不舒服? **州**是**訂單**的財產。這並不意味着它必須存儲在數據庫中。 – cezar

回答

1

據我瞭解你的問題,你的模型有一個屬性,它隨時都在改變,可以使用存儲在數據庫中的數據進行計算。簡單的例子將是一個類。該類別具有諸如姓名,日期,出生地點,place_of_birth等屬性。超過該年齡也是的財產。但是我們不會將該屬性保存在數據庫中,因爲它會根據其他因素(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 
+0

這很好,但是一個要求是我能夠查詢數據庫中的緩存數據 - 所以它確實必須以某種方式存在於數據庫級別。但@cached_property對於我的項目中的其他部分非常有趣。 – stschindler

相關問題