Django-fr

Forum

#1 05-02-2012 15:35:37

DjangoMax
Membre
Inscription : 05-02-2012
Messages : 2

Polymorphisme

Bonjour,

Voilà je débute sous django et cela fait quelques jours que je bloque sur cette question:

Un extrait de mes models:

class Entretien(models.Model):
     culture = models.ForeignKey(Culture)
     date = models.DateField()

     def __unicode__(self):
          return 'Entretien -' + str(self.date)

class Arrosage(Entretien):
     volume = models.IntegerField()

     def __unicode__(self):
          return 'Arrosage -' + str(self.date)

class Coupe(Entretien):
     coupe = models.CharField(max_length=100)

     def __unicode__(self):
          return 'Coupe -' + str(self.date)

Rapidement, l'application permettrait de gérer une culture. Culture que l'on peut entretenir (arroser, couper, engraisser...), le but étant de générer un carnet de bord. Voici ce que j'aimerai faire dans ma vue:

...
entretiens = Entretien.objects.all().order_by('date')[:5]
...
return render_to_response('core/index.html', entretiens)

Je voudrais obtenir les 5 derniers entretiens d'un utilisateur. Le problème c'est qu'en faisant cela je n'obtient que des objets de type Entretien! Or je voudrais obtienir des objets de type Arrosage et Coupe (polymorphisme). Comment faire?

Faut-il absolument installer le django-model-utils? (InheritanceCastModel)

Merci.

Hors ligne

#2 05-02-2012 16:19:49

doddo
Membre
Inscription : 29-12-2010
Messages : 20

Re : Polymorphisme

salut,

un foreign key sur User dans Entretien, ça ne convient pas ?


a+

On Sun, 05 Feb 2012 14:35:38 +0000, Maxime wrote:

> Bonjour,
>

> Voilà je débute sous django et cela fait quelques jours que je
bloque
> sur cette question:
>
> Un extrait de mes models:
>

class Entretien(models.Model):
> culture =
models.ForeignKey(Culture)
> date = models.DateField()
> 
> def
__unicode__(self):
> return 'Entretien -' + str(self.date)
> 
> class
Arrosage(Entretien):
> volume = models.IntegerField()
> 
> def
__unicode__(self):
> return 'Arrosage -' + str(self.date)
> 
> class
Coupe(Entretien):
> coupe = models.CharField(max_length=100)
> 
> def
__unicode__(self):
> return 'Coupe -' + str(self.date)
>

>
>
Rapidement, l'application permettrait de gérer une culture. Culture
que
> l'on peut entretenir (arroser, couper, engraisser...), le but
étant de
> générer un carnet de bord. Voici ce que j'aimerai faire dans
ma vue:
>
>

...
> entretiens =
Entretien.objects.all().order_by('date')[:5]
> ...
> return
render_to_response('core/index.html', entretiens)

>
> Je
voudrais obtenir les 5 derniers entretiens d'un utilisateur. Le
>
problème c'est qu'en faisant cela je n'obtient que des objets de type
>
Entretien! Or je voudrais obtienir des objets de type Arrosage et
Coupe
> (polymorphisme). Comment faire?
>
> Faut-il absolument
installer le django-model-utils? (InheritanceCastModel)
>
> Merci.
>
_______________________________________________
> django mailing list
>
django _AT_ lists.afpy.org [1]
>
http://lists.afpy.org/mailman/listinfo/django [2]


Links:
------
[1]
mailto:django _AT_ lists.afpy.org
[2]
http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#3 05-02-2012 17:02:31

DjangoMax
Membre
Inscription : 05-02-2012
Messages : 2

Re : Polymorphisme

Ah, excusez moi je me suis mal exprimé. Le lien avec un utilisateur est déjà présent dans culture: un utilisateur possède un ensemble de cultures. Une culture possède un ensemble d'entretiens. Maintenant, ce que j'aimerai c'est que dans la page "mes entretiens", l'utilisateur puisse voir les entretiens qu'il a fait sur ses cultures. Mais ne nous préoccupons pas du côté utilisateur. Simplement, j'aimerai que:

Entretien.objects.all().order_by('date')[:5]

me retourne une liste d'objets de type Arrosage et Coupe (classe filles) et non pas de type Entretien (classe mère).

Est-ce possible?

Hors ligne

#4 05-02-2012 17:23:59

abki
Membre
Lieu : Paris
Inscription : 11-08-2010
Messages : 49
Site Web

Re : Polymorphisme

> me retourne une liste d'objets de type Arrosage et Coupe (classe filles)
> et non pas de type Entretien (classe mère).
>
> Est-ce possible?
>

oui, http://djangosnippets.org/snippets/1037/

Hors ligne

#5 05-02-2012 17:35:30

abki
Membre
Lieu : Paris
Inscription : 11-08-2010
Messages : 49
Site Web

Re : Polymorphisme

Le 5 février 2012 17:23, Amirouche Boubekki
<amirouche.boubekki _AT_ gmail.com>a écrit :

>
> me retourne une liste d'objets de type Arrosage et Coupe (classe filles)
>> et non pas de type Entretien (classe mère).
>>
>> Est-ce possible?
>>
>
> oui, http://djangosnippets.org/snippets/1037/
>
>
C'est la version courte pour résoudre le problème, si tu veux un truc
optimiser il faut faire appel à .values('_child_name', 'childrend_id') [1]
dans iterator du ChildQuerySet et changer le code en conséquence.

[1] c'est pas children_id mais un truc dans le genre

Hors ligne

#6 05-02-2012 20:37:31

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : Polymorphisme

je crois que la solution polymorphisme la plus utilisée pour django est :
https://github.com/chrisglass/django_polymorphic

Hors ligne

Pied de page des forums