如何删除字段或不';不允许在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中执行此操作,您的选项可能有限。我假设您已签出。