Поиск типа поля модели в Джанго - PullRequest
2 голосов
/ 30 января 2012

У меня есть такая модель:

class Profile(models.Model):
    user = models.OneToOneField("User", verbose_name=u"user", null=True, blank=True, default=None)
    monthly_income = models.ForeignKey(MonthlyIncome, verbose_name=u"Monthly Income", null=True, blank=True, default=None)
    car = models.ManyToManyField(Car, verbose_name=u"Car?", null=True, blank=True, default=None)

Если пользователь изменяет свой профиль, эти изменения сохраняются в другой таблице (UpdateLog).В связи с этим я делаю запрос из UpdateLog, и если элемент находится в Updatelog, поле выбора будет отключено.Поскольку отключенные поля выбора не отправляют никаких данных на сервер, я добавляю значение отключенного поля с request.POST.copy() в следующем представлении:

в представлении:

if request.method == "POST":
    post_values = request.POST.copy()
    query = UpdateLog.objects.filter(user=request.user.id)
    for a in query:
        field = a.filed_name
        try:
            sd = eval("profile.%s.id"%field) 
            post_values.update({field: u"%s"%sd})
        except AttributeError:
            print field

Проблема заключается в следующем:sd = eval("profile.%s.id"%field) работает только для данных ForeignKey.Я должен отделить sd для полей Foreignkey и Manytomany.Как узнать тип полей модели в поле зрения?

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Рассмотрите возможность выбора вариантов модели Django (например, класса Meta) для более общего решения.

from django.db import models

model_fields = dict((f.name, f) for f in MyModel._meta.fields)
test_field = field_dict[field_name]
if isinstance(test_field, models.OneToOneField):
    #it's a one to one field!
elif isinstance(test_field, models.ManyToManyField):
    #it's a one to one field!
elif isinstance(test_field, models.IntegerField):
    #it's an integer field!
#...

Одним из преимуществ этого подхода, помимо универсальности, является то, что он не 'не требует доступа к базе данных - он просто проверяет схему, указанную в определениях вашей модели.

2 голосов
/ 30 января 2012

Я думаю, вы ищете что-то вроде этого:

from django.db import models
field_name = a.field_name
field = getattr(profile, field_name)
if isinstance(field, models.Model):
    # It's a model object
    # (accessing a foreign key returns a model object)
elif isinstance(field, models.manager.Manager):
    # It's a manager object
    # (accessing a many to many field returns a ManyRelatedManager)
else:
    raise ValueError("Unexpected field type")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...