121 votes

Dans Django - Héritage de modèle - Vous permet-il de remplacer l'attribut d'un modèle parent ?

Je cherche à faire ceci :

class Place(models.Model):
   name = models.CharField(max_length=20)
   rating = models.DecimalField()

class LongNamedRestaurant(Place):  # Subclassing `Place`.
   name = models.CharField(max_length=255)  # Notice, I'm overriding `Place.name` to give it a longer length.
   food_type = models.CharField(max_length=25)

C'est la version que j'aimerais utiliser (bien que je sois ouvert à toute suggestion) : http://docs.djangoproject.com/en/dev/topics/db/models/#id7

Est-ce pris en charge à Django ? Dans la négative, existe-t-il un moyen d'obtenir des résultats similaires ?

19voto

blueyed Points 7719

Voir https://stackoverflow.com/a/6379556/15690 :

class BaseMessage(models.Model):
    is_public = models.BooleanField(default=False)
    # some more fields...

    class Meta:
        abstract = True

class Message(BaseMessage):
    # some fields...
Message._meta.get_field('is_public').default = True

9voto

Brian Luft Points 938

A collé votre code dans une nouvelle application, ajouté une application à INSTALLED_APPS et exécuté syncdb :

django.core.exceptions.FieldError: Local field 'name' in class 'LongNamedRestaurant' clashes with field of similar name from base class 'Place'

On dirait que Django ne supporte pas ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X