这是我的尝试:
class RevisionControlledValue(models.Model):
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User)
value = models.TextField()
class Meta:
ordering = ('-created', )
class DjangoPony(models.Model):
names = models.ManyToManyField(RevisionControlledValue, \
related_name="fromname_djangopony_set")
colors = models.ManyToManyField(RevisionControlledValue, \
related_name="fromcolor_djangopony_set")
@property
def name(self):
return self.names.latest('created')
class RevisionControlledValue(models.Model):
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
value = models.TextField()
class Meta:
ordering = ('-created', )
class DjangoPony(models.Model):
@property
def name(self):
return self.revisioncontrolledvalue.latest('created')
对我来说,两者都感觉有些不确定,尤其是content_type,我认为这应该是有利的选择。
对于content_type为1,在不同类型的修订控制字段的模型中没有知识,如果我想要不同类型的字段该怎么办?
对于第一个,多对多与逻辑不匹配,因为它是一对多的关系。
任何提示或想法? :)
答案 0 :(得分:2)
有django-reversion的应用。如果你真的只想对一个字段进行reversion控制,则将其分解为自己的表并建立一对一的关系。
答案 1 :(得分:1)
我想你忘记了标题中的 fields 这个词。 =)我想我会使用一种让原始模型保持原样的方法。以:
开头的东西class DjangoPony(models.Model):
name = models.TextField()
color = models.TextField()
class RevisionControlledValue(models.Model):
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User)
value = models.TextField()
field = models.CharField(max_length=20)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
这假设您只将它用于TextFields。为了使它真的很漂亮,你可以创建一个新的字段,假设ReversionTextField
在保存模型时自动创建反转对象。
答案 2 :(得分:1)
@Jason
您无需从reversion文档中创建新模型:
保存字段子集 如果您只想将一个字段子集保存到修订版,则可以为register方法指定fields参数。
reversion.register(YourModel, fields=["pk", "foo", "bar"])
Reversion已经过很好的测试,而低级api让你可以完成我想要的所有功能。