在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级别强制执行的。 –
我编辑的问题更清楚。谢谢 –