¿Cómo se crea un DateField, que se incrementa automáticamente en 1 día de la misma forma que lo hace el campo pk ?
Por ejemplo, crearía un nuevo objeto, este sería del 16/04/2017, el próximo objeto sería del 17/04/2017, incluso si ambos se envían el mismo día.
¿Cómo haría esto?
¿Qué tal anular el método de save del modelo de esta manera?
from datetime import datetime, timedelta from django.db import models class MyModel(models.Model): date = models.DateField() # the below method will NOT work if auto_now/auto_now_add are set to True def save(self, *args, **kwargs): # count how many objects are already saved with the date this current object is saved date_gte_count = MyModel.objects.filter(date__gte=self.date).count() if date_gte_count: # there are some objects saved with the same or greater date. Increase the day by this number. self.date += timedelta(days=date_gte_count) # save object in db super().save(*args, **kwargs) Por supuesto, lo anterior se puede implementar usando señales de Django . El pre_save .
Así que resolví esto usando partes de la respuesta de Nik_m y también algunos de mis conocimientos.
Esencialmente, hice un ciclo while que seguía iterando y agregando un día, a diferencia de la respuesta de Nik_m, que no funciona después del tercer objeto debido a la falta de iteración.
def save(self, *args, **kwargs): same_date_obj = Challenge.objects.filter(date=self.date) if same_date_obj.exists(): while True: if Challenge.objects.filter(date=self.date).exists(): self.date += timedelta(days=1) else: break super().save(*args, **kwargs)EDITAR: esta respuesta ya no es válida, requiere un ciclo while y, por lo tanto, una cantidad indefinida de consultas. La respuesta modificada de @ Nik_m es mejor.