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.