django django-models django-mptt

Django-¿Cómo obtener self.id cuando guardas un nuevo objeto?



django-models django-mptt (5)

Tengo un problema en uno de mis modelos. Estoy cargando una imagen, y quiero almacenar la identificación (pk en la tabla de la base de datos), pero necesito saber en qué momento Django tendrá acceso a self.id

models.py

class BicycleAdItemKind(MPTTModel): def url(self, filename): pdb.set_trace() url = "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, filename) return url def item_kind_image(self): return ''<img align="middle" src="/media/%s" height="60px" />'' % self.image item_kind_image.allow_tags = True # Bicicleta completa, Componentes para bicicleta, Acessorios para ciclista n_item_kind = models.CharField(max_length=50) parent = TreeForeignKey(''self'', null=True, blank=True, related_name=''children'') description = models.TextField(null=True, blank=True) image = models.ImageField(upload_to=url, null=True, blank=True) date_inserted = models.DateTimeField(auto_now_add=True) date_last_update = models.DateTimeField(auto_now=True) def __unicode__(self): return self.n_item_kind class MPTTMeta: order_insertion_by = [''n_item_kind'']

El problema está en el método url() ; Solo puedo obtener self.id al actualizar un objeto, no consigo el self.id cuando creo un nuevo objeto. ¿Cómo puedo modificar este modelo para que obtenga self.id al crear un nuevo objeto?

Con el código actual, cuando estoy creando un nuevo objeto, terminaré con una url como:

MultimediaData/HelpAdImages/ItemKind/None/somefile.jpg

Y necesito tener algo como:

MultimediaData/HelpAdImages/ItemKind/35/somefile.jpg

¿Alguna pista?


Es posible que necesite guardar este archivo / instancia dos veces:

Puede usar una señal post_save en el modelo que busca el indicador creado y volver a guardar la instancia que actualiza el url (y mover / renombrar el archivo según sea necesario), ya que la instancia ahora tendrá un ID. Sin embargo, asegúrate de que solo realizas esto condicionado en la creación; de lo contrario, realizarás bucles de forma continua guardando: el guardar inicia una señal de guardado posterior, que hace un guardado, lo que inicia una señal de guardado posterior ...

Ver https://docs.djangoproject.com/en/dev/ref/signals/#post-save


Nota: models.AutoField(primary_key=True) tener los models.AutoField(primary_key=True) atributo models.AutoField(primary_key=True) ; de lo contrario, la base de datos se actualizará con una nueva identificación, pero Django no la reconocerá.

models.AutoField(primary_key=True)


Sé que este es uno viejo, pero pensé que esto podría ser útil para alguien, parece funcionar bien hasta ahora.

Views.py

#Queries model and appends id''s to list try: qs = YourModel.objects.all() qslist = [] for item in qs: qslist.append(item.id) newid = int(max(qslist) + 1) #If no entries are found, assume this is the first entry. except: newid = 1

Sin embargo, no estoy seguro de lo bien que esto funcionará en DB grandes.


Si es un objeto nuevo, primero debe guardarlo y luego acceder a self.id, porque

"There''s no way to tell what the value of an ID will be before you call save(), because that value is calculated by your database, not by Django."

Verifique el documento de django https://docs.djangoproject.com/en/dev/ref/models/instances/


q = Order.objects.values_list(''id'', flat=True).order_by(''-id'')[:1] if len(q): self.number = str(self.id) if self.id else str(int(q.get()) + 1) else: self.number = 1