Vous n'êtes pas identifié(e).
Bonjour tout le monde,
J'aimerais savoir à quoi sert exactement ContentType
from django.contrib.contenttypes.models import ContentType
J'ai lu la documentation Django, et ça me dit entre autre ceci :
Django includes a contenttypes application that can track all of the models installed in your Django-powered project, providing a high-level, generic interface for working with your models.
Ce qui m'interpelle, c'est ceci :
a high-level, generic interface for working with your models
Qu'est-ce que cela nous apporte de plus de travailler avec ContentTye ?
Merci d'avance pour l'aide.
Hors ligne
Bonjour beegees.
Pour faire simple, le content type te permet de faire une ForeignKey sur plusieurs types d'objets.
Imaginons que tu fasses un site internet avec un système de commentaires.
Tu vas avoir des commentaires sur les vidéos, les news, les photos et les commentaires des autres.
Plutôt que de faire un système de commentaire pour chacun avec une grande part de copier/coller, tu peux utiliser le content type pour lier ton commentaire soit à un objet video, soit à une news soit à une photo soit à un autre commentaires.
Grâce au mécanisme de ContentType tu pourras récupèrer à chaque fois les commentaires de ton objet.
Avec une seule app plus simplement maintenable et vulgarisable.
Avec Django c'est DRY (Don't Repeat Yourself), Pluggable et Réutilisable
Hors ligne
Bonjour beegees.
Pour faire simple, le content type te permet de faire une ForeignKey sur plusieurs types d'objets.
Imaginons que tu fasses un site internet avec un système de commentaires.
Tu vas avoir des commentaires sur les vidéos, les news, les photos et les commentaires des autres.Plutôt que de faire un système de commentaire pour chacun avec une grande part de copier/coller, tu peux utiliser le content type pour lier ton commentaire soit à un objet video, soit à une news soit à une photo soit à un autre commentaires.
Grâce au mécanisme de ContentType tu pourras récupèrer à chaque fois les commentaires de ton objet.
Avec une seule app plus simplement maintenable et vulgarisable.Avec Django c'est DRY (Don't Repeat Yourself), Pluggable et Réutilisable
Bonjour Rémy,
Merci pour ta réponse.
Je vais essayer de trouver dans quelle partie de mon code on utilise ContentType.
Est-ce qu'un bout de code m'informe qu'on utilise ContentType ?
Merci encore pour l'aide.
Hors ligne
Bonjour,
Ben lorsque tu utilises Content Type tu le sais généralement.
Je ne comprends pas ta question. As-tu une erreur qui te parle de ContentType par exemple ?
Il peut y avoir un problème lorsque tu fais un syncdb avec un initial_data qui contient des content types.
Pour éviter ce problème, tu peux faire un dumpdata avec ces valeurs :
python manage.py dumpdata --format yaml --indent=4 --exclude=contenttypes --exclude=sessions > initial_data.yaml
Tu peux aussi faire ton syncdb sans initial_data dans un premier temps, vider la base de ContentType et relancer le syncdb avec ton initial_data.
Le problème c'est que tu risques d'avoir des incohérences de content_types. (S'il modifie l'ordre des ID par l'ajout d'une nouvelle app par exemple)
Il faudra bien faire attention d'y veiller.
Mais si tu n'utilises pas les content_types, tu n'as pas à t'en soucier.
Dernière modification par Rémy HUBSCHER (18-01-2011 11:09:21)
Hors ligne
Bonjour,
Merci pour ta réponse.
Je reprends une application qui est faite à 90%.
ContentType est utilisé dans le code mais ce n'est pas moi qui l'ai intégré.
Merci pour ton aide.
Hors ligne
Si tu reprends une application, tu peux voir les models impactés par ContentType car ils auront ce genre de ForeignKey :
class Favorite(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
Le content_object, le content_type et le object_id
Hors ligne
En effet, j'ai ceci :
content_type = models.ForeignKey(ContentType,editable=False,null=True)
self.content_type = ContentType.objects.get_for_model(self.__class__)
et ceci :
def as_event_class(self):
content_type = self.content_type
model = content_type.model_class()
if (model == Event):
return self
return model.objects.get(id=self.id)
Merci encore pour l'aide.
Hors ligne