如何删除字段或不';不允许在django模块的错误字段中添加内容?
提前感谢您查看并回答我的问题 图像:如何删除字段或不';不允许在django模块的错误字段中添加内容?,django,validation,database-design,django-models,django-forms,Django,Validation,Database Design,Django Models,Django Forms,提前感谢您查看并回答我的问题 图像: 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.M
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()))
问题是:
解决方案:(这是我想做的事情的一张照片)
背景:
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模块中,我有3个表:Movies、Metadata和一个称为moviesmata的连接表。电影存储电影标题(搏击俱乐部),元数据存储元数据名称(日期、导演、演员、收入等)以及元数据的类型(文本、日期、用户、小数、整数)。最后,连接表将电影与多个元数据以及该电影元数据的值(取决于元数据的类型)(textValue、integerValue、usersValue、decimalValue等)连接起来
问题:
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()))
问题是,当有人向电影(搏击俱乐部)添加元数据(日期)时,预期结果是dateValue字段有一些内容(1999/10/15),但用户也可以在textValue或其他不是该元数据类型的值类型中添加内容。最后,电影《搏击俱乐部》的元数据的值可以是1999/10/15
36000000.00
(小数字段)等
问题:
如何删除或不允许用户在错误字段中添加数据
在模板(post表单)中,如何仅显示电影字段、元数据字段和正确的值字段
代码:
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()))
您正在使用DBMS反模式EAV。您是已经存在的用于管理数据和元数据的DBMS。请使用它
没有metatdata的类/表
您的元数据类/表在另一方面也会受到此问题的影响。不要有表示行的列表的字段/列。只需将列表元素名称设置为元数据字段/列名即可。除了上面提到的以外,您不应该有类/表元数据。因为每一行都编码电影的属性。特定字段/电影专栏应该只在电影中出现
从上面链接的其中一个答案中:
需要使用EAV“这样每个实体类型都可以
“使用自定义字段扩展”是错误的。只需通过调用实现
它有时会更新元数据表,而不仅仅是更新常规数据表
表:DDL而不是DML
您使用的是反模式。没有metatdata表。只有电影的属性可以是电影的字段/列。设计用于管理数据和元数据。问题是我不知道所有可能的metadata。我希望用户创建自己的metadata。请检查我添加的图像。我还更改了问题,因为我认为可能存在解决方案。谢谢!!!是的,人们总是这么想。您的程序完全复制了DBMS中的功能,因此使用DBMS不会有问题。(请参阅我更新的答案。)阅读链接,研究EAV。Django不一定能让这变得容易;但EAV也是一个负担。希望你能得到Django的答案。你的链接看起来解决了你的问题。请不要生气,但现在我还不太明白。我只是一个图书馆员,正在尝试构建一些东西。我想你告诉我的是,我应该ldn不要试图重建DBMS(textValue字段、dateValue字段等),因为“每一行都在编码电影的属性”。因此,我不应该这样做,而是应该将元数据作为字段/列添加到类/表电影中。我希望澄清我的答案。由于您在Django中执行此操作,您的选项可能有限。我假设您已签出。