1

一意の名前フィールドを持つ Country というクラスを定義しました。

class Country(models.Model):
    class Meta:
        verbose_name_plural = "Countries"
    name = models.CharField(max_length=100, unique=True, null=False)
    def __unicode__(self):
        return self.name

管理ページでは、これは期待どおりに動作します。データベースに既に存在する国を作成すると、「この名前の国は既に存在します。」というエラーで失敗します。完全。

対話型プロンプト ( ) で同じことをテストしようとするとmanage.py shell、そのようなエラーは発生しません。代わりに、複製オブジェクトがデータベースに追加されます。

>>> from rack.models import Country
>>> usa = Country(name="United States of America")
>>> usa.save()
>>> canada = Country(name="United States of America")
>>> canada.save()
>>> canada.name
'United States of America'
>>> Country.objects.all()
[<Country: United States of America>, <Country: United States of America>]

私は Django を初めて使用します。シェルが unique フィールドを無視する理由を教えてもらえますか?

4

3 に答える 3

2

DBテーブルをリセットしましたか?私の推測では、unique=Trueなしで以前にモデルを定義しました。

ドキュメントによると、uniqueは管理者レベルとデータベースレベルで適用され、症状に一致します。つまり、シェルではなく、管理者で機能します。

http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.unique

于 2010-12-17T19:47:19.150 に答える
1

どのデータベースを使用していますか? sqlite と South を使用している場合、sqlite テーブルに一意の制約を追加できないというバグがあります。

その場合、管理フォームが一意性を強制する可能性があるため、チェックがデータベースに到達することさえありませんが、コマンドラインから実行すると、一意性を強制するためにデータベースに依存しています (これは sqlite ではありません)。この場合はそうします)。

于 2010-12-17T19:14:17.850 に答える
0

Countryロード元が、rack.modelsあなたが考えているバージョンを使用していると確信していますか? をチェックし__file__て、キャッシュされたバージョンを使用していないことを確認します。または、インポート後にモデルを変更しても、必ずしもそれがトリップするとは限りません。

unique モデルデータベース層の両方で一意性を強制する必要があります

于 2010-12-17T19:06:40.107 に答える