tutorial together example python django model version history

python - together - Almacene la historia versionada de Field en un modelo de Django



django unique together (1)

Tengo un modelo con un campo de texto, que necesita ser versionado.

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

El comportamiento esperado es el siguiente:

  • Si creo un nuevo libro con un resumen, el texto se guardará normalmente
  • Si el resumen se actualiza, el estado antiguo debe almacenarse en algún lugar con un número de versión y marca de tiempo.
  • Debería ser fácilmente posible consultar el actual, un rango de o versiones específicas
  • Solo el summary campo debe ser versionado, no el modelo completo

Cómo debería hacer esto?


Lo tengo yo mismo.

Primero crea un nuevo modelo llamado 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)

Ahora extienda el modelo inicial de la siguiente manera:

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

Ahora, cada vez que actualice un libro, se creará una nueva versión incrementada del resumen para el libro específico a menos que no haya cambiado.