在Django中,我試圖創建一個基本模型,用於以透明方式跟蹤某個其他模型數據的不同版本。喜歡的東西:改變繼承的Django模型的唯一字段
class Warehouse(models.Model):
version_number = models.IntegerField()
objects = CustomModelManagerFilteringOnVersionNumber()
class Meta:
abstract=True
def save(self, *args, **kwargs):
# handling here version number incrementation
# never overwrite data but create separate records,
# don't delete but mark as deleted, etc.
pass
class SomeData(Warehouse):
id = models.IntegerField(primary_key=True)
name = models.CharField(unique=True)
我的問題是,SomeData.name
其實並不是唯一的,元組('version_number', 'name')
是。
我知道我可以使用Meta
類SomeData
unique_together
但我想知道這是否可以以更透明的方式完成。也就是說,動態修改/創建這個unique_together
字段。
最後說明:可能用模型繼承來處理這個問題並不是正確的方法,但是如果我能處理這個字段唯一性問題,它看起來非常吸引我。
編輯:很明顯,在這種情況下,「動態」這個詞是誤導性的。我確實希望在數據庫級別保留唯一性。這個想法是有不同版本的數據。
一個這裏舉一個小例子,與上面的模型(假設的抽象模型繼承,所以這一切都是在同一個表):
該數據庫可包含:
version_number | id | name | #comment 0 | 1 | bob | first insert 0 | 2 | nicky | first insert 1 | 1 | bobby | bob changed is name on day x.y.z 0 | 3 | malcom| first insert 1 | 3 | malco | name change 2 | 3 | momo | again...
和我的自定義模型管理器將過濾數據(以對版本號最大爲每一個唯一的ID),以便: SomeData.objects.all() 將返回
id | name 1 | bobby 2 | nicky 3 | momo
,並且還會提供其他方法,如版本n-1中那樣可以返回數據。
很明顯,我將使用時間戳而不是版本號,以便我可以檢索給定日期的數據,但原理保持不變。
現在的問題是,當我做 ./manage.py makemigrations 以上的機型,它會強制唯一性上SomeData.name和SomeData.id當我需要的是在獨特性('SomeData.id','version_number')和('SomeData.name','version_number')。明確地說,我需要將基本模型中的一些字段追加到db中聲明爲唯一的繼承模型的字段中,並且這個命令有時會運行並且/或者生產服務器運行。
我讀了幾次,仍然可以得到的問題,你可以添加代碼示例? –
您希望模型中的每個字段都具有此unique_together過濾器嗎?請記住,這是在db級別強制執行的。 –
我編輯的問題更清楚。謝謝 –