Django 1.7.2迁移变化不断检测到

时间:2015-01-08 00:09:48

标签: python django django-migrations

下面我的模型似乎在运行makemigrations时不断检测到更改的更改。 Django 1.6.4与South的情况并非如此。

您的模型的更改尚未在迁移中反映出来,因此不会应用。 运行manage.py makemigrations进行新的迁移,然后重新运行manage.py migrate以应用它们。

型号:

class Item (models.Model):
    capacity = models.IntegerField(
        default=500,
        validators=[MinValueValidator(0)],
        help_text="Total remaining quantity in stock."
    )
    total_purchased = models.IntegerField(
        default=0,
        validators=[MaxValueValidator(capacity)],
        help_text="Total items purchased."
    )

我通过注释total_purchased字段的validators属性解决了这个问题。有没有办法绕过这个问题而不删除验证器,同时仍然能够引用“total_purchased”验证器中的前一个字段“capacity”?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您不能以这种方式在验证器中引用capacity。加载models.py时会MaxValueValidator实例化,而不是在验证特定项目时实例化 - capacity是模型字段,而不是特定项目的容量。

无法从验证程序中访问其他字段的值。当您需要执行依赖于多个字段的验证时,您可以创建自定义clean()方法:

class Item (models.Model):
    capacity = models.IntegerField(
        default=500,
        validators=[MinValueValidator(0)],
        help_text="Total remaining quantity in stock."
    )
    total_purchased = models.IntegerField(
        default=0,
        help_text="Total items purchased."
    )

    def clean(self):
        """
        Ensures that total_purchased does not exceed the capacity
        """
        if self.total_purchased > self.capacity:
            raise ValidationError(
                'Total purchased can not exceed the capacity'
            )