【发布时间】:2014-08-09 10:20:38
【问题描述】:
非常感谢您查看并回答我的问题,
图片:
问题: https://drive.google.com/file/d/0Bw4K4uUse4DYWHZmYW9kZWJtcE0/edit?usp=sharing
thePosibleSolution:(这是我想要做的 Photoshop 图像) https://drive.google.com/file/d/0Bw4K4uUse4DYcjZ1TnBVdUk4R3M/edit?usp=sharing
背景:
在我的 django 模块中,我有 3 个表,电影、元数据和一个名为 MoviesMetadata 的连接表。电影存储电影标题(搏击俱乐部),元数据存储元数据名称(日期、导演、演员、收入等)和元数据的类型(文本、日期、用户、小数、整数)。最后,联结表根据元数据的类型(textValue、integerValue、usersValue、decimalValue 等)连接具有多个元数据的电影和该电影元数据的值。
问题:
问题在于,当有人将元数据(日期)添加到电影(搏击俱乐部)时,预期的结果是 dateValue 字段有一些内容(1999/10/15),但用户也可以在textValue 或不是该元数据类型的其他值类型。最后,电影 The Fight Club 的元数据 Date 的 values 可以是 1999/10/15(dateValue 字段)、admin(usersValue 字段)、36,000,000.00(decimalValue 字段)等
问题:
- 如何擦除或不允许用户在错误的字段中添加数据?
- 在模板(post form)中,如何只显示电影字段、元数据字段和正确的值字段?
代码:
class Movies(models.Model):
name = models.CharField(max_length=100)
metadata = models.ManyToManyField(Metadata, through='MoviesMetadata')
def __str__(self):
return str(self.name)
class MoviesMetadata(models.Model):
movie = models.ForeignKey(Movies)
metadata = models.ForeignKey(Metadata)
textValue = models.CharField(max_length=100, blank=True, null=True)
dateValue = models.DateField(auto_now=False, auto_now_add=False, blank=True, null=True)
userValue = models.ForeignKey(User, blank=True, null=True)
decimalValue = models.DecimalField(max_digits=18, decimal_places=2, blank=True, null=True)
def _value(self):
'''
@property returns only the values from the selected fieldtype,
ignore the other fieldtypes values.
'''
if self.metadata.fieldtype == '0':
return self.textValue
elif self.metadata.fieldtype == '1':
return self.dateValue
elif self.metadata.fieldtype == '2':
return self.userValue
else:
return self.decimalValue
value = property(_value)
def __str__(self):
return ('%s: %s' % (self.metadata, self.value))
class Metadata(models.Model):
name = models.CharField(max_length=100)
METADATA_FIELD_TYPE = (
('0', 'Text Value'),
('1', 'Date Value'),
('2', 'User Value'),
('3', 'Decimal Value'),
)
fieldtype = models.CharField(max_length=1, choices=METADATA_FIELD_TYPE, default='0')
def __str__(self):
return ('%s (%s)' % (self.name, self.get_fieldtype_display()))
【问题讨论】:
标签: django validation database-design django-models django-forms