Django - Comment faire pour obtenir l'auto.id lors de l'enregistrement d'un nouvel objet?
J'ai un problème dans un de mes modèles. J'upload une image, et je veux stocker l'id (pk dans la table de base de données), mais j'ai besoin de savoir à quel point Django auront accès à 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']
Le problème est dans la url()
méthode; je ne peux faire self.id
lors de la mise à jour d'un objet, je n'ai pas l' self.id
lors de la création d'un nouvel objet. Comment puis-je modifier ce modèle, afin que je reçois self.id
lors de la création d'un nouvel objet?
Avec le code actuel, lorsque je crée un nouvel objet je vais finir avec une url du genre:
MultimediaData/HelpAdImages/ItemKind/None/somefile.jpg
Et j'ai besoin d'avoir quelque chose comme:
MultimediaData/HelpAdImages/ItemKind/35/somefile.jpg
Toute indices?
- Pouvez-vous indiquer où le 'url()' fonction est utilisée?
- Il est utilisé dans le domaine de l'image, de l'image " = modèles.ImageField(upload_to=url, null=True, vide=True)". Lorsque l'image est téléchargée la méthode est activé.
Vous devez vous connecter pour publier un commentaire.
Si c'est un nouvel objet, vous devez tout d'abord l'enregistrer et ensuite accéder à l'autonomie.id, parce que
Vérifier django document https://docs.djangoproject.com/en/dev/ref/models/instances/
Vous avez besoin d'enregistrer ce fichier/exemple deux fois:
Vous pouvez utiliser un post_save signal sur le modèle qui ressemble pour le créé le drapeau, et ré-enregistre l'instance mise à jour de l'url (et déplacer/renommer le fichier si nécessaire), depuis l'instance va maintenant avoir une carte d'identité. Assurez-vous de le faire uniquement conditionnée à l'créée, mais, sinon, vous aurez continuellement en boucle dans l'économie: l'économie lance un post-enregistrement du signal, ce qui ne le save, qui lance un post-enregistrement d'un signal...
Voir https://docs.djangoproject.com/en/dev/ref/signals/#post-save
Remarque: Vous devez avoir le
models.AutoField(primary_key=True)
attribut, sinon la base de données sera mise à jour avec une nouvelle id, mais Django ne le reconnaissent pas.Je comprends que c'est vieux, mais pour quelqu'un qui bute sur ce sujet dans l'avenir, ici, est en fait la façon dont vous le faites maintenant dans Django.
Je sais que c'est vieux mais j'ai pensé que cela pourrait être utile à quelqu'un, semble bien fonctionner jusqu'à présent.
Views.py
Cependant, je ne suis pas sûr de savoir comment bien exécuter sur de grandes DBs.