2015-10-14 40 views
0

我有一個機器人模型,如:在django中捕獲瞬時模型狀態的最佳做法是什麼?

class Robot(models.Model):  
    version = models.CharField(max_length=20) 
    can_version = models.CharField(max_length=20) 
    uuid = models.CharField(max_length=20) 
    power_status = models.PositiveSmallIntegerField(choices=POWER_STATUS) 
    working_status = models.PositiveSmallIntegerField(choices=WORKING_STATUS) 

我想機器人的當前狀態(所有字段)保存到數據庫時發生錯誤,因爲我需要這些信息來分析錯誤的原因,並且查詢這些信息是一項頻繁的操作。

Model audit不是我想要的,因爲我不需要保存整個更改歷史記錄,而只是發生錯誤時的瞬時狀態。我不想創建一個複製所有Robot字段並用於保存Robot狀態的新模型。

+0

怎麼樣一個記錄器,例如[哨兵](https://github.com/getsentry/sentry) –

+0

@ Hedde van der Heide因爲我經常需要查詢這些信息,所以效率很重要。 – lengxuehx

回答

1

這聽起來像狀態應該是一個單獨的模型/類與FK機器人,這樣你的機器人有一個「列表」的所有以前的狀態「,你只需要查詢最新的。

class ModelStatus(models.Model): 
    robot = models.ForeignKey(Robot) 
    power_status = models.PositiveSmallIntegerField(choices=POWER_STATUS) 
    working_status = models.PositiveSmallIntegerField(choices=WORKING_STATUS) 

你可能想好歹添加命令他們比其他ID但這就是決定我真的不能幫你。

如果你不希望整個列表,然後你可以有兩個OneToOneFieldsRobot

current_status = models.OneToOneField(ModelStatus, null=True) 
previous_status = models.OneToOneField(ModelStatus, null=True) 
+0

這是一個選擇,但實際上我有很多模型,我不喜歡爲每個模型創建ModelStatus。另外,無論何時參考表更改,ModelStatus都必須更改。 – lengxuehx

+0

@lengxuehx - 你可能會使用數據庫模型繼承,(通用字段然後擴展自定義)。至於變化,你可以設置[信號](https://docs.djangoproject.com/en/1.8/topics/signals/) – Sayse

+0

這很酷,但繼承需要大量的工作,以當前的代碼(需要創建許多抽象模型)。 – lengxuehx

相關問題