Django unique_together不起作用:“指的是不存在的字段”

时间:2015-11-20 16:13:13

标签: python django models

在Django中创建模型,我需要使两个整数字段的组合唯一:

class example(models.Model):
    lenght = models.PositiveSmallIntegerField
    position = models.PositiveSmallIntegerField
    otherfield = models.ForeignKey('onetable')
    otherfield2 = models.ForeignKey('anothertable')

    class Meta:
        unique_together = (("lenght", "position"),)

因此,当我同步数据库时,收到以下错误消息:

执行manage.py syncdb SystemCheckError:系统检查发现了一些问题:

ERRORS:
prj.CodeBlock: (models.E012) 'unique_together' refers to the non-existent field 'lenght'.
prj.CodeBlock: (models.E012) 'unique_together' refers to the non-existent field 'position'.
The Python REPL process has exited
>>> 

我发现如果将字段类型更改为“charfield”,则不会收到任何错误消息:

class example(models.Model):
    lenght = models.CharField(max_length=8)
    position = models.CharField(max_length=8)
    otherfield = models.ForeignKey('onetable')
    otherfield2 = models.ForeignKey('anothertable')

    class Meta:
        unique_together = (("lenght", "position"),)

为什么我不能使整数字段的组合独特?

1 个答案:

答案 0 :(得分:3)

因为您没有声明(实例化)整数字段(您刚刚引用了它们的类):

[AttributeUsage(AttributeTargets.Class)]
public class Sccxxxxxxxxx : ValidationAttribute

class example(models.Model): lenght = models.PositiveSmallIntegerField position = models.PositiveSmallIntegerField length不是字段实例,而是字段类。尝试将它们实例化为表中实际存在的字段:

position

在其元类中,Django检测并枚举字段实例(即通过运行class example(models.Model): lenght = models.PositiveSmallIntegerField() position = models.PositiveSmallIntegerField() )并创建其列。您可以在类中声明任何值(方法是属性;也许您的类具有自定义异常或isinstance(v, Field)参数的常量值,...),但只会枚举Field实例。这适用于字段类:Django不会特别对待它们:也许您将自定义choices=类声明为模型中的内部类(仅用于您的模型),并且您不会期望它变为公正一个字段...这就是为什么Django不会将对字段类的引用转换为对字段实例的引用的原因。

你必须明确。也许你忘记了括号。