2013-03-29 2 views
3

Могу ли я получить тип связанного поля из набора параметров модели?Есть ли способ получить тип связанного поля из набора параметров модели в Django?

Пусть рассмотрим пример модели:

class Semester(models.Model): 
    active = models.BooleanField(default=False, verbose_name="Active") 

class Subject(models.Model): 
    name = models.CharField(max_length=100, verbose_name="Name") 
    semester = models.ForeignKey(Semester, verbose_name="Semester") 

, если у меня есть какое-то название поля в переменной и QuerySet я могу это сделать:

querySet = Subject.objects.all() 

some_field_name = 'name' 
field_type = querySet.model._meta.get_field(some_field_name).get_internal_type() 

Есть ли способ, чтобы получить связанные тип поля, например, :

querySet = Subject.objects.all() 

some_field_name = 'semester__active' 
field_type = ? 
+0

'для субъекта в QuerySet: тип печати (subject.semester.active)'? –

+0

thansk для вашего предложения, но type() возвращаемый тип объекта, к сожалению, мне нужен тип поля –

ответ

1

Спасибо за любую помощь!

я найти решение с некоторой помощью от this answer:

main, related = some_field_name.split("__") 
field_type = querySet.model._meta.get_field(main).rel.to._meta.get_field(related).get_internal_type() 
+0

Это работает, но уродливо, поскольку оно повторно реализует часть Django: -s –

2

Попробуйте использовать get_field_by_name:

field_type = querySet.model._meta.get_field_by_name(some_field_name).get_internal_type() 

От Django's source code:

def get_field_by_name(self, name): 
    """ 
    Returns the (field_object, model, direct, m2m), where field_object is 
    the Field instance for the given name, model is the model containing 
    this field (None for local fields), direct is True if the field exists 
    on this model, and m2m is True for many-to-many relations. When 
    'direct' is False, 'field_object' is the corresponding RelatedObject 
    for this field (since the field doesn't have an instance associated 
    with it). 

    Uses a cache internally, so after the first access, this is very fast. 
    """ 

попробовать также:

field = querySet.model._meta.get_field_by_name("semester") 
field_type = field[0].rel.to._meta.get_field_by_name("active").get_internal_type() 
+0

Спасибо за ваш ответ, но к сожалению .get_field_by_name («active») возвращает ошибку FieldDoesNotExist. Ваше другое предложение querySet.model._meta.get_field_by_name ("semester"). Rel.get_field_by_name ("active"). Get_internal_type() return Объект AttributeError 'tuple' не имеет атрибута 'rel' –

+0

Повторите попытку второго предложения с помощью 'field_type = field [0] .rel.get_field_by_name («active»). get_internal_type() ' –

+0

к несчастью ваше отредактированное предложение return AttributeError: объект 'ManyToOneRel' не имеет атрибута 'get_field_by_name' –

Смежные вопросы