文字列からmodelオブジェクトを取得する方法
modelオブジェクトを取得したい
文字列からmodelオブジェクトを取得するためには、いくつかの方法があります。
- アプリケーション名とmodel名から取得する。
- 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'),)となっているので気をつける必要があります。