2010-01-21 6 views
1

J'ai un modèle appelé Carte qui a une relation ManyToMany à Tag. Lorsque je sauvegarde une carte, je souhaite également créer un produit, que je souhaite utiliser pour la même relation ManyToMany.Enregistrer la méthode manytomany

Comment accéder aux tags de l'instance? self.tags.all() donne une liste vide, alors que si je vérifie après l'enregistrement, la carte a en fait des balises. Mon code est ci-dessous. Pour l'anecdote, j'utilise Django 1.0.5.

class Card(models.Model): 
    product  = models.ForeignKey(Product, editable=False, null=True) 
    name  = models.CharField('name', max_length=50, unique=True, help_text='A short and unique name or title of the object.') 
    identifier = models.SlugField('identifier', unique=True, help_text='A unique identifier constructed from the name of the object. Only change this if you know what it does.', db_index=True) 
    tags  = models.ManyToManyField(Tag, verbose_name='tags', db_index=True) 
    price  = models.DecimalField('price', max_digits=15, decimal_places=2, db_index=True) 
    def add_product(self): 
     product = Product( 
      name = self.name, 
      identifier = self.identifier, 
      price = self.price 
     ) 
     product.save() 
     return product 
    def save(self, *args, **kwargs): 
     # Step 1: Create product 
     if not self.id: 
      self.product = self.add_product() 
     # Step 2: Create Card 
     super(Card, self).save(*args, **kwargs) 
     # Step 3: Copy cards many to many to product 
     # How do I do this? 
     print self.tags.all() # gives an empty list?? 

Répondre

0

Vous n'ajoutez aucune étiquette à la carte. Vous ne pouvez pas ajouter de relations ManyToMany avant d'avoir enregistré la carte, et il n'y a pas de temps entre l'appel save et l'appel au self.tags.all() pour qu'ils soient définis.

2

Utilisez-vous le django-admin pour enregistrer le modèle et les tags? Les champs plusieurs-à-plusieurs ne sont enregistrés là qu'après le signal de post-sauvegarde du modèle. Ce que vous pouvez faire dans ce cas est la méthode save_model des classes d'administration. E.g .:

class CardAdmin(admin.ModelAdmin): 

    def save_model(self, request, obj, form, change): 
     obj.save() 
     form.save_m2m() 
     #from this point on the tags are accessible 
     print obj.tags.all()