【问题标题】:Good way for a Revision Controllled Model? - Django修订控制模型的好方法? - 姜戈
【发布时间】:2011-07-22 19:55:27
【问题描述】:

这是我的尝试:

示例 #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 之一,模型中不知道不同类型的修订控制字段,如果我想要不同类型的字段怎么办?

  • 对于第一个,多对多并不真正符合逻辑,因为它是一对多关系。


有什么建议或想法吗? :)

【问题讨论】:

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


【解决方案1】:

@杰森

您不需要创建新模型...从reversion docs:

保存字段子集 如果您只想将字段的子集保存到修订版中,则可以为 register 方法指定一个 fields 参数。

reversion.register(YourModel, fields=["pk", "foo", "bar"])

Reversion 已经过很好的测试,低级别的 api 可以让你做几乎所有我想做的事情。

【讨论】:

    【解决方案2】:

    django-reversion 有一个应用程序。如果您真的只想对一个字段进行还原控制,请将其拆分到自己的表中并建立一对一的关系。

    【讨论】:

      【解决方案3】:

      我想你忘记了标题中的 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,它会在保存模型时自动创建还原对象。

      【讨论】:

        猜你喜欢
        • 2020-08-16
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 2020-08-17
        • 1970-01-01
        相关资源
        最近更新 更多