Vous n'êtes pas identifié(e).
Bonjour,
J'ai 3 tables : article qui peut parler de plusieurs plats et ces plats peuvent avoir plusieurs variantes .
donc j'ai une relation many to many entre article et plat et une autre (many to many) entre plat et variante.
Mon problème c'est qu'il faut une autre relation entre article et variante pour que je puisse par ex chercher tous les articles qui parlent d'un plat x de variante y.
Donc il me faut une table supplementaire avec id_article id_plat id_variante et pas que id_article id_plat.
Comment preciser ça dans mon model.py ?
Merci d'avance pour votre aide
Hors ligne
A l'aide de l'attribut through :
http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships
Cdlt,
Samuel Martin
2010/11/4 kernel3 <kernel_panic34 _AT_ yahoo.fr>
> Bonjour,
> J'ai 3 tables : [b]article[/b] qui peut parler de plusieurs [b]plats[/b]
> et ces plats peuvent avoir plusieurs [b]variantes [/b].
> donc j'ai une relation many to many entre article et plat et une autre
> (many to many) entre plat et variante.
> Mon problème c'est qu'il faut une autre relation entre article et
> variante pour que je puisse par ex chercher tous les articles qui parlent
> d'un plat x de variante y.
> Donc il me faut une table supplementaire avec id_article id_plat
> id_variante et pas que id_article id_plat.
> Comment preciser ça dans mon model.py ?
> Merci d'avance pour votre aide
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>
Hors ligne
Merci pour ta réponse.
Mais c'est pas vraiment ce que je cherche, si je fais comme ça variante appartiendra exclusivement à article vu que je dois spécifier une clé étrangére (article) dans variante.
alors que je voudrais en postant l'article on choisit tous les plats et les variantes (pas nécessairement toutes) dont je veux parler.
voila ce que j'ai testé :
class Plat(models.Model):
nom = models.CharField(max_length=200)
def __unicode__(self):
return self.nom
class Article(models.Model):
nom = models.CharField(max_length=200)
plat = models.ManyToManyField(Plat, through='Variante')
def __unicode__(self):
return self.nom
class Variante(models.Model):
nom = models.CharField(max_length=200)
plat = models.ForeignKey(Plat)
article = models.ForeignKey(Article)
Normalemnt je dois mettre article = models.ManyToManyField(article) dans variante mais j'ai cette erreur.
Error: One or more models did not validate:
article.article: 'Plat' is a manually-defined m2m relation through model Variante, which does not have foreign keys to Plat and Article
L'une des solutions que j'ai c'est de mettre 2 relations many to many dans article une pour plat et l'autre pour variante mais je me demandais si à la place d'avoir 2 tables avoir qu'une qui regroupe le tt ( id_article id_plat id_variante)
Merci !
Hors ligne
Bonjour,
J'ai bien peur de ne pas comprendre :
Avec :
class Article(models.Model):
nom = models.CharField(max_length=200)
plat = models.ManyToManyField(Plat, through='Variante')
class Plat(models.Model):
nom = models.CharField(max_length=200)
class Variante(models.Model):
nom = models.CharField(max_length=200)
plat = models.ForeignKey(Plat)
article = models.ForeignKey(Article)
Tu as la création de la table Article, Plat, Variante. Aussi dans variante
il est possible de lié de différente façon Article et Plat non ?
Si tu souhaites ( id_article,id_plat, id_variante) dans une autre table et
non fusionné au sein de Variante on peut procéder ainsi :
class Article(models.Model):
nom = models.CharField(max_length=200)
class Plat(models.Model):
nom = models.CharField(max_length=200)
class Variante(models.Model):
nom = models.CharField(max_length=200)
class Liaison(models.Model):
plat = models.ForeignKey(Plat)
article = models.ForeignKey(Article)
variante = models.ForeignKey(Variante)
ce qui génère le code sql suivant :
CREATE TABLE `xxx_article` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`nom` varchar(200) NOT NULL
)
;
CREATE TABLE `xxx_plat` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`nom` varchar(200) NOT NULL
)
;
CREATE TABLE `xxx_variante` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`nom` varchar(200) NOT NULL
)
;
CREATE TABLE `xxx_liaison` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`plat_id` integer NOT NULL,
`article_id` integer NOT NULL,
`variante_id` integer NOT NULL
)
;
ALTER TABLE `xxx_liaison` ADD CONSTRAINT `plat_id_refs_id_28828614` FOREIGN
KEY (`plat_id`) REFERENCES `xxx_plat` (`id`);
ALTER TABLE `xxx_liaison` ADD CONSTRAINT `article_id_refs_id_db2f0562`
FOREIGN KEY (`article_id`) REFERENCES `xxx_article` (`id`);
ALTER TABLE `xx_liaison` ADD CONSTRAINT `variante_id_refs_id_166a210f`
FOREIGN KEY (`variante_id`) REFERENCES `xxx_variante` (`id`);
Cdlt,
Samuel Martin
2010/11/4 kernel3 <kernel_panic34 _AT_ yahoo.fr>
> Merci pour ta réponse.
> Mais c'est pas vraiment ce que je cherche, si je fais comme ça variante
> appartiendra exclusivement à article vu que je dois spécifier une clé
> étrangére (article) dans variante.
> alors que je voudrais en postant l'article on choisit tous les plats et
> les variantes (pas nécessairement toutes) dont je veux parler.
> voila ce que j'ai testé :
>
> class Plat(models.Model):
>
> nom = models.CharField(max_length=200)
>
>
> def __unicode__(self):
>
> return self.nom
>
>
> class Article(models.Model):
>
> nom = models.CharField(max_length=200)
> plat = models.ManyToManyField(Plat, through='Variante')
>
>
> def __unicode__(self):
>
> return self.nom
>
> class Variante(models.Model):
> nom = models.CharField(max_length=200)
> plat = models.ForeignKey(Plat)
> article = models.ForeignKey(Article)
>
> Normalemnt je dois mettre article = models.ManyToManyField(article) dans
> variante mais j'ai cette erreur.
>
> Error: One or more models did not validate:
> article.article: 'Plat' is a manually-defined m2m relation through model
> Variante, which does not have foreign keys to Plat and Article
>
>
> L'une des solutions que j'ai c'est de mettre 2 relations many to many dans
> article une pour plat et l'autre pour variante mais je me demandais si à
> la place d'avoir 2 tables avoir qu'une qui regroupe le tt ( id_article
> id_plat id_variante)
>
> Merci !
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>
Hors ligne