文字列からmodelオブジェクトを取得する方法

modelオブジェクトを取得したい

文字列からmodelオブジェクトを取得するためには、いくつかの方法があります。

  1. アプリケーション名とmodel名から取得する。
  2. model名からContentTypeを利用して取得する。

などがあります。

アプリケーション名とmodel名から取得する

User modelを取得してみます。
取得にはget_model(app_name, model_name)を使用します。

>>>from django.db.models import get_model
>>>m = get_model('auth', 'user')
>>>m.objects.get(pk=1)
>>><User: username>

この他にapp_name.model_nameの文字列からも取得することが出来ます。

>>>from django.db.models import get_model
>>>USER = 'auth.user'
>>>m = get_model(*USER.split('.', 2))
>>>m.objects.get(pk=1)
>>><User: username>

ContentTypeからmodel名を使って取得する

model名から取得してみます。

>>>from django.contrib.contenttypes.models import ContentType
>>>m = ContentType.objects.get(model = 'user').model_class()
>>>m.objects.get(pk=1)
>>><User: username>

注意が要るのでContentTypeのmodelを見てみます。

class ContentType(models.Model):
    name = models.CharField(max_length=100)
    app_label = models.CharField(max_length=100)
    model = models.CharField(_('python model class name'), max_length=100)
    objects = ContentTypeManager()

    class Meta:
        verbose_name = _('content type')
        verbose_name_plural = _('content types')
        db_table = 'django_content_type'
        ordering = ('name',)
        unique_together = (('app_label', 'model'),)

    def __unicode__(self):
        return self.name

    def model_class(self):
        "Returns the Python model class for this type of content."
        from django.db import models
        return models.get_model(self.app_label, self.model)

    def get_object_for_this_type(self, **kwargs):
        """
        Returns an object of this type for the keyword arguments given.
        Basically, this is a proxy around this object_type's get_object() model
        method. The ObjectNotExist exception, if thrown, will not be caught,
        so code that calls this method should catch it.
        """
        return self.model_class()._default_manager.get(**kwargs)

unique_together = (('app_label', 'model'),)となっているので気をつける必要があります。

twitter 2009-10-10 23:00:12.425019

参照サイト

Recent Updates

URLConf Tip 01 - キャプチャの有無にかかわらず同一のviewで処理する
Markdownの入力補助"wmd"をAdmin siteで使う
ModelFormでfieldのwidgetを変更する
動的なformを作る 6 - Dynamic Inline Admin site編
Formsetsを使う3 - inlineformset_factory編
動的なformを作る 5 - django-dynamic-formset編
Formクラスからメディアを定義する
複数のmodelを結合する 2 - Proxy model編
複数のmodelを結合する 1
ModelFormでfieldの表示順番を変える
Admin siteのwidgetを個別に変更する
formfield_overridesを使ってAdmin siteのwidgetを変更する
Admin siteのlist_displayをカスタマイズする - リンク編
Admin siteのlist_displayをカスタマイズする - 基本編
Admin siteのTextareaの高さを自在に変更する - admin.py編