我的django项目有一种情况,我需要在model.py中使用if语句。其中一个应用程序将允许用户在另一个应用程序中为文档创建元数据。所以首先我要创建"元数据"存储其名称,标签和字段类型的类,这是一个选择字段。在另一个类(MetadataValues)上,我创建一个ForeignKey到元数据类和一个if语句返回一个字段,如果" fieldtype"在"元数据"内class是" text(0)"或者返回日期字段,如果" fieldtype"是" date(1)"。有没有办法做到这一点?我是编程的新手,所以我不知道背后的所有逻辑。
以下是代码:
class Metadata(models.Model)
name = models.CharField(max_length=100, unique=True)
label = models.CharField(max_length=100)
METADATA_FIELD_TYPE = (
('0', 'Text'),
('1', 'Date'),
)
fieldtype = models.CharField(max_length=1, choices=METADATA_FIELD_TYPE, default='0')
def __unicode__(self):
return (self.label)
class MetadataValue(models.Model)
metadata = models.ForeignKey(Metadata)
if metadata.fieldtype == '0'
value = models.CharField(max_length=100)
else
value = models.DateField(auto_now=False, auto_now_add=False)
def __unicode__(self):
return (self.metadata.label)
class Document(models.Model)
name = models.CharField(max_length=100, unique=True)
metadata = models.ManyToManyField(MetadataValue)
def __unicode__(self):
return (self.name)
答案 0 :(得分:4)
在模型中创建表格。表格有严格的数据类型。您不能在一列中使用不同的数据类型。您可以使用此解决方案:
class MetadataValue(models.Model)
metadata = models.ForeignKey(Metadata)
value_char = models.CharField(max_length=100)
value_date = models.DateField(auto_now=False, auto_now_add=False)
@property
def value(self):
if ...:
return self.value_char
return value_date
答案 1 :(得分:1)
你可能会强迫这样的事情付出很多努力,但我会反对它。你不能以一种简单的方式做这样的事情的原因是每个Django模型(通常)由一个或多个数据库表支持,其中字段对应于列。列具有单一类型,因此字段必须是字段字段或日期,但不能同时为两者。
你的if语句不起作用的原因是你需要知道创建后备数据库时(即运行manage.py syncdb时)metadata.fieldtype的值,而不是当对象是创建
答案 2 :(得分:0)
以下是完成的代码:
class Metadata(models.Model):
name = models.CharField(max_length=100, unique=True, verbose_name = _('name'))
label = models.CharField(max_length=100, verbose_name = _('label'))
METADATA_FIELD_TYPE = (
('0', 'Text (Select CharFields Values Only)'),
('1', 'Date (Select DateFields Values Only)'),
('2', 'Numeric (Select Numeric Values Only)'),
)
fieldtype = models.CharField(max_length=1, choices=METADATA_FIELD_TYPE, default='0', verbose_name = _('Field type'))
char_value = models.ManyToManyField(CharValue, blank=True, verbose_name = _('CharField Value(s)'))
date_value = models.ManyToManyField(DateValue, blank=True, verbose_name = _('DateField Value(s)'))
numeric_value = models.ManyToManyField(NumericValue, blank=True, verbose_name = _('Numeric Value(s)'))
def _value(self):
if self.fieldtype == '0':
return u'%s' % (self.char_value)
elif self.fieldtype == '1':
return u'%s' % (self.date_value)
else:
return u'%s' % (self.numeric_value)
value = property(_value)
class Meta:
verbose_name = _('metadata')
verbose_name_plural = _('metadata')
def __unicode__(self):
return u'%s' % (self.label)