在djang中寻找模型场类型

2024-10-03 13:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的模型:

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中,则选择框将被禁用。因为禁用的SelectBox不向服务器发送任何数据,所以我使用request.POST.copy()添加禁用字段的值,如下所示:

观点:

^{pr2}$

问题是:sd = eval("profile.%s.id"%field)只适用于ForeignKey数据。我必须为foreignkey和manytomy字段分隔sd。如何识别视图中模型字段的类型?在


Tags: 数据name模型none视图truedefaultverbose
2条回答

我想你在找这样的东西:

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")

考虑查看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!
#...

这种方法的好处之一,除了一般性之外,它不需要任何数据库访问-它只检查模型定义指定的模式。在

相关问题 更多 >