Вопрос по python – Хранить версионную историю Field в модели Django

4

У меня есть модель с текстовым полем, которая должна быть версионной.

class Book(models.Model):
    title = models.CharField(max_length=100)
    summary = models.TextField()

Ожидаемое поведение выглядит следующим образом:

If i create a new book with a summary, the text will be saved normally If the summary is updated, the old state needs to be stored somewhere with a version number and timestamp It should be easily possible to query for the current, a range of or specific versions Only the field summary should be versioned, not the whole model

Как мне это сделать?

Ваш Ответ

1   ответ
6

Получил это сам.

Сначала создайте новую модель под названиемSummaryHistory:

class SummaryHistory(models.Model):
    version = models.IntegerField(editable=False)
    book = models.ForeignKey('Book')
    text = models.TextField()

    class Meta:
        unique_together = ('version', 'book',)

    def save(self, *args, **kwargs):
        # start with version 1 and increment it for each book
        current_version = SummaryHistory.objects.filter(book=self.book).order_by('-version')[:1]
        self.version = current_version[0].version + 1 if current_version else 1
        super(SummaryHistory, self).save(*args, **kwargs)

Теперь расширьте исходную модель следующим образом:

class Book(models.Model):
    title = models.CharField(max_length=100)
    summary = models.TextField()

    def summary_history(self):
        return SummaryHistory.objects.filter(book=self).order_by('-version')

    def save(self, *args, **kwargs):
        super(Book, self).save(*args, **kwargs)
        # save summary history
        summary_history = self.summary_history()
        if not summary_history or self.summary != summary_history[0].text:
            newSummary = SummaryHistory(book=self, text=self.summary)
            newSummary.save()

Теперь при каждом обновлении книги будет создаваться новая увеличенная версия сводки для конкретной книги, если она не изменилась.

Error: User Rate Limit Exceededstackoverflow.com/questions/5597378/…
Error: User Rate Limit Exceeded Alp
Error: User Rate Limit Exceeded Alp
Error: User Rate Limit ExceededcommunityError: User Rate Limit Exceeded
Error: User Rate Limit Exceededdocs.djangoproject.com/en/dev/topics/signals

Похожие вопросы