2013-06-24 1 views
1

J'ai obtenu les modèles (pertinents) suivants. fournitures est un champ de plusieurs-à-plusieurs.L'enregistrement du champ m2m dans Django Admin échoue avec "ValueError: doit avoir une valeur avant que cette relation many-to-many puisse être utilisée"

class Supplies(models.Model): 
    id = models.IntegerField(primary_key=True, editable=False) 
    name_html = models.CharField(max_length=100L) 
    name_verbose = models.CharField(max_length=150L) 
    class Meta: 
     db_table = u'supplies' 
    def __unicode__(self): 
     return self.name_html 

class Manufacturer(models.Model): 
    id = models.IntegerField(primary_key=True, editable=False) 
    name = models.CharField(max_length=135) 
    country = models.ForeignKey(Country) 
    supplies = models.ManyToManyField(Supplies, blank=True) 
    class Meta: 
     db_table = u'manufacturer' 
    def __unicode__(self): 
     return self.name 
     return self.country 

Table intermédiaire:

CREATE TABLE IF NOT EXISTS `manufacturer_supplies` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `manufacturer_id` int(11) NOT NULL, 
    `supplies_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `manufacturer_id` (`manufacturer_id`), 
    KEY `supplies_id` (`supplies_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=174 ; 
ALTER TABLE `manufacturer_supplies` 
    ADD CONSTRAINT `manufacturer_supplies_ibfk_3` FOREIGN KEY (`supplies_id`) REFERENCES `supplies` (`id`), 
    ADD CONSTRAINT `manufacturer_supplies_ibfk_2` FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturer` (`id`); 

L'ensemble des choses montre parfaitement dans le Django admin avec filter_horizontal. Mais quand j'essaie d'enregistrer un nouveau "Fabricant", je reçois: ValueError: "<Manufacturer: thisIsTheManufacturerName>" needs to have a value for field "manufacturer" before this many-to-many relationship can be used.

Je suppose par "fabricant" le champ manufacturer_id de la table intermédiaire est la cause de l'erreur. Je suis perdu ...

Histoire Lorsque j'ai conçu ma mise en page de base de données, je ne savais pas que Django pouvait gérer les relations m2m lui-même. J'ai donc commencé avec un modèle m2m défini avec through. J'ai eu la même erreur. J'ai donc supprimé mon modèle, table DB et a couru manage.py syncdb. Ensuite, Django a créé la table intermédiaire elle-même. Parce que j'ai changé de nouveau, j'ai posté la disposition de la table intermédiaire, juste pour exclure les erreurs.

+0

Qu'est-ce que sql personnalisé? Est-ce le vôtre? Si oui, où avez-vous vu que quelque chose comme ça est nécessaire? Avez-vous lu le moindre détail de la documentation de Django? – rantanplan

+1

J'ai ajouté une note expliquant pourquoi j'ai ajouté la présentation DB. J'ai lu la documentation 1.5 sur m2m, parmi beaucoup d'autres articles de forum, blogs et questions de Stack Overflow. – weeheavy

+1

Essayez de supprimer la base de données entière, 'syncdb' et réessayez. – rantanplan

Répondre

0

Le problème lui-même est pas résolu, mais la raison pour laquelle il n'est maintenant clair pour moi:

En admin.py, je montre sur le terrain avec un list_display (malheureusement que je ne l'ai pas mentionné ici parce que Je pensais qu'il était sans rapport) - mais le docs dit :

ManyToManyField fields aren’t supported, because that would entail executing a separate SQL statement for each row in the table. If you want to do this nonetheless, give your model a custom method, and add that method’s name to list_display. (See below for more on custom methods in list_display.)

Questions connexes