Django-fr

Forum

  • Accueil
  • » Django-fr
  • » Héritage + m2m + through + related_name dans la même barque

#1 10-08-2010 10:30:23

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

Héritage + m2m + through + related_name dans la même barque

Bonjour,

Je coince actuellement sur l'utilisation conjointe d'une relation m2m
(ManytoMany), de related_name, et de through le tout dans une classe mère
abstract.
*
Voici le code fonctionnel :*

class aTalkable(Model):
    talk = ManyToManyField(Talk, blank = True, null = True, related_name =
"%(class)s_talk",  editable = False)

    class Meta:
        abstract = True
*
Voici le code qui pose problème  (simple ajout de through):*

class aTalkable(Model):
    from pdn.talks.models import Talk, TalkRelations
    talk = ManyToManyField(Talk, blank = True, null = True, through =
'TalkRelations', related_name = "%(class)s_talk",  editable = False)

    class Meta:
        abstract = True


---
*
L'erreur générée :*
Error: One or more models did not validate:
checklists.checklist: 'talk' specifies an m2m relation through model
TalkRelations, which has not been installed
checklists.criterion: 'talk' specifies an m2m relation through model
TalkRelations, which has not been installed
projects.project: 'talk' specifies an m2m relation through model
TalkRelations, which has not been installed
projects.projectevaluation: 'talk' specifies an m2m relation through model
TalkRelations, which has not been installed
projects.projectevaluationresult: 'talk' specifies an m2m relation through
model TalkRelations, which has not been installed
projects.pageevaluationresult: 'talk' specifies an m2m relation through
model TalkRelations, which has not been installed
validations.validationevaluationresult: 'talk' specifies an m2m relation
through model TalkRelations, which has not been installed
validations.crawledpageevaluationresult: 'talk' specifies an m2m relation
through model TalkRelations, which has not been installed

Hors ligne

#2 10-08-2010 18:11:28

Bruno Renié
Membre
Inscription : 11-08-2010
Messages : 52

Re : Héritage + m2m + through + related_name dans la même barque

Bonjour,

On Tue, Aug 10, 2010 at 10:30 AM, Samuel Martin <martin.sam _AT_ gmail.com> wrote:
> Bonjour,
>
> <snip>
> --
> aTalkable est hérité de plusieurs classe fille (modelfille1, modelfille2
> ...), dans mon premier exemple (sans through), l'attribut "talk" va donner
> lieu à la création des tables "modelfille1_modelfille1_talk" et
> "modelfille2_modelfille2_talk". Jusque la pas de problème. Sauf que pour
> chaque table de liaison j'aimerais rajouter de nouveaux attributs autre que
> l'id de talk et l'id de modelfille1, TalkRelations sert justement à cela
> mais impossiible de le définir via through dans une table mère.
>
> Y a t'il solution particulière ? faut t'il définir une à une les relations
> m2m et oublier l'avantage de l'héritage ? J'ai même pensé à  définir
> TalkRelations avec les atributs "content_type et object_id" pour gérer N
> type d'objet, mais je dois revoir toutes mes actions et ca pour l'instant
> c'est niet.

Quel est le contenu de la class TalkRelations ? Je ne suis pas sûr de
bien comprendre l'objectif, tu voudrais avoir une table "through" par
modèle héritant de "aTalkable" ?

Si TalkRelation a une ForeignKey vers Talk et une autre vers
aTalkable, ça ne validera pas : on ne peut pas définir de clé
étrangère vers des classes abstraites.

Sinon, il y peut-être une erreur de syntaxe :

talk = ManyToManyField(Talk, blank=True, null=True, through='TalkRelations')

TalkRelation est importé juste au dessus. Il n'y a donc pas besoin de
le mettre entre quotes, sinon Django s'attend à ce qu'il soit défini
plus tard dans le fichier.

Est-ce qu'il serait possible d'avoir le code de TalkRelations ?

Bon courage,
Bruno

>
> Merci d'avance pour vos réponses.
> --
> Samuel Martin
> http://blog.creaone.fr
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 10-08-2010 18:21:48

Bruno Renié
Membre
Inscription : 11-08-2010
Messages : 52

Re : Héritage + m2m + through + related_name dans la même barque

Re,

2010/8/10 Bruno Renié <buburno _AT_ gmail.com>:
>> Y a t'il solution particulière ? faut t'il définir une à une les relations
>> m2m et oublier l'avantage de l'héritage ? J'ai même pensé à  définir
>> TalkRelations avec les atributs "content_type et object_id" pour gérer N
>> type d'objet, mais je dois revoir toutes mes actions et ca pour l'instant
>> c'est niet.
>
> Quel est le contenu de la class TalkRelations ? Je ne suis pas sûr de
> bien comprendre l'objectif, tu voudrais avoir une table "through" par
> modèle héritant de "aTalkable" ?

Si c'est le cas, il faut définir les relations à la main. Il y a un
ticket avec patch qui peut rendre le procédé légèrement plus simple :

http://code.djangoproject.com/ticket/11760

Désolé pour le double post,
Bruno

> Si TalkRelation a une ForeignKey vers Talk et une autre vers
> aTalkable, ça ne validera pas : on ne peut pas définir de clé
> étrangère vers des classes abstraites.
>
> Sinon, il y peut-être une erreur de syntaxe :
>
> talk = ManyToManyField(Talk, blank=True, null=True, through='TalkRelations')
>
> TalkRelation est importé juste au dessus. Il n'y a donc pas besoin de
> le mettre entre quotes, sinon Django s'attend à ce qu'il soit défini
> plus tard dans le fichier.
>
> Est-ce qu'il serait possible d'avoir le code de TalkRelations ?
>
> Bon courage,
> Bruno
>
>>
>> Merci d'avance pour vos réponses.
>> --
>> Samuel Martin
>> http://blog.creaone.fr
>>
>> _______________________________________________
>> django mailing list
>> django _AT_ lists.afpy.org
>> http://lists.afpy.org/mailman/listinfo/django
>>
>

Hors ligne

#4 11-08-2010 08:49:25

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

Re : Héritage + m2m + through + related_name dans la même barque

Bonjour


http://code.djangoproject.com/ticket/11760 semble répondre partiellement à
mon problème :

Le contenu de TalkRelations :

class TalkRelations(Model):
    rank = PositiveIntegerField(null = True, blank = True)
    talk = ForeignKey(Talk)

Hors ligne

#5 11-08-2010 08:53:22

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

Re : Héritage + m2m + through + related_name dans la même barque

Oups désolé message parti tout seul voici la suite :



Bonjour
>


> http://code.djangoproject.com/ticket/11760 semble répondre partiellement à
> mon problème :
>
>

> Le contenu de TalkRelations :
>
>

> class TalkRelations(Model):
>     rank = PositiveIntegerField(null = True, blank = True)
>     talk = ForeignKey(Talk)
>
       project = ForeignKey(Project)  ou bien checklist =
ForeignKey(checklist) ou .....


Autre question,

en me basant  sur l'exemple du ticket , est t'il nécessaire de créer autant
de "

Class ClassA_MyClass(models.Model)" qu'il existe de relations
(project, checklist,...).  ??


Samuel Martin

Hors ligne

#6 11-08-2010 11:20:00

Bruno Renié
Membre
Inscription : 11-08-2010
Messages : 52

Re : Héritage + m2m + through + related_name dans la même barque

2010/8/11 Samuel Martin <martin.sam _AT_ gmail.com>:
> Autre question,
>
> en me basant  sur l'exemple du ticket , est t'il nécessaire de créer autant
> de "
>
> Class ClassA_MyClass(models.Model)" qu'il existe de relations (project,
> checklist,...).  ??

Oui, le patch permet juste d'automatiser la déclaration du ManyToMany
dans la classe abstraite. Pour chaque modèle qui hérite de la classe
abstraite, il faut donc aussi définir la classe servant de "through".

Bruno

> Samuel Martin
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

  • Accueil
  • » Django-fr
  • » Héritage + m2m + through + related_name dans la même barque

Pied de page des forums