修订控制模型的好方法? - Django

时间:2011-03-25 10:46:55

标签: python sql django version-control django-models

这是我的尝试:

示例#1

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')

示例#2

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,在不同类型的修订控制字段的模型中没有知识,如果我想要不同类型的字段该怎么办?

  • 对于第一个,多对多与逻辑不匹配,因为它是一对多的关系。


任何提示或想法? :)

3 个答案:

答案 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让你可以完成我想要的所有功能。