2

以下に、実行時に変更された変更を継続的に検出するように見えるモデルがあります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 フィールドのバリデーター属性をコメントアウトすることで、これを解決しました。「total_purchased」バリデーターで前のフィールド「capacity」を引き続き参照できる一方で、バリデーターを削除せずにこの問題を回避する方法はありますか? どんな助けでも大歓迎です。

4

1 に答える 1

1

このようにバリデーターで参照することはできませんcapacity。特定のMaxValueValidatorアイテムが検証されたときではなく、models.py がロードされたときにインスタンス化され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'
            )
于 2015-01-08T00:19:33.590 に答える