Хороший способ для ревизионной модели? - Джанго - PullRequest
2 голосов
/ 25 марта 2011

вот моя попытка:

Пример # 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, в модели разных типов полей, контролируемых ревизиями, нет знаний, а что, если мне нужны поля разных типов?

  • Для первого «Многие ко многим» на самом деле не соответствует логике, поскольку это отношение «один ко многим».


Есть советы или идеи? :)

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Для этого есть приложение Джанго-реверсия . Если вы действительно хотите иметь контроль реверсии только для одного поля, разбейте его на собственную таблицу и установите соотношение 1: 1.

1 голос
/ 15 августа 2011

@ Джейсон

Вам не нужно создавать новые модели ... из документов возврата:

Сохранение подмножества полей Если вы хотите, чтобы только подмножество полей было сохраненодо ревизии вы можете указать аргумент fields для метода register.

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

Реверсия довольно хорошо протестирована, а API низкого уровня позволяет вам делать почти все, что я когда-либо хотел.

1 голос
/ 25 марта 2011

Я думаю, что вы забыли слово поля в заголовке.=) Думаю, я бы использовал подход, который оставляет исходную модель нетронутой.Что-то, начинающееся с:

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, которое автоматически создает объект реверсии при сохранении модели.

...