Django-fr

Forum

#1 04-11-2010 14:51:12

kernel3
Membre
Inscription : 04-11-2010
Messages : 2

Relation entre 3 tables

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

#2 04-11-2010 15:10:45

Samuel Martin
Membre
Inscription : 11-08-2010
Messages : 30

Re : Relation entre 3 tables

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

#3 04-11-2010 16:53:56

kernel3
Membre
Inscription : 04-11-2010
Messages : 2

Re : Relation entre 3 tables

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

#4 05-11-2010 14:01:35

Samuel Martin
Membre
Inscription : 11-08-2010
Messages : 30

Re : Relation entre 3 tables

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

Pied de page des forums