web-dev-qa-db-fra.com

Comment puis-je obtenir le nom du modèle ou le type de contenu d'un objet Django?

Disons que je suis dans le code de sauvegarde. Comment puis-je obtenir le nom du modèle ou le type de contenu de l'objet et l'utiliser?

from Django.db import models

class Foo(models.Model):
    ...
    def save(self):
        I am here....I want to obtain the model_name or the content type of the object

Ce code fonctionne, mais je dois connaître le nom_modèle:

import Django.db.models
from Django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get(model=model_name)
model = content_type.model_class()
43
Seitaridis

Vous pouvez obtenir le nom du modèle de l'objet comme ceci:

self.__class__.__name__

Si vous préférez le type de contenu, vous devriez pouvoir l'obtenir comme ceci:

ContentType.objects.get_for_model(self)
69
gravelpot

La méthode get_for_model fait des trucs de fantaisie, mais il y a des cas où il vaut mieux ne pas utiliser ces trucs de fantaisie. Supposons en particulier que vous vouliez filtrer un modèle lié à ContentType, peut-être via une clé étrangère générique ?? La question ici était de savoir quoi utiliser pour model_name dans:

content_type = ContentType.objects.get (model = model_name)

Utilisation Foo._meta.model_name, ou si vous avez un objet Foo, alors obj._meta.model_name est ce que vous recherchez. Ensuite, vous pouvez faire des choses comme

Bar.objects.filter(content_type__model=Foo._meta.model_name)

C'est un moyen efficace de filtrer la table Bar pour vous renvoyer des objets qui sont liés au type de contenu Foo via un champ nommé content_type.

3
AlanSE