38

これはdjangoのドキュメントからのものです:

Field.unique

True の場合、このフィールドはテーブル全体で一意である必要があります。

これは、データベース レベルで、モデルの検証によって適用されます。一意のフィールドに重複する値を持つモデルを保存しようとすると、モデルの save() メソッドによって django .db.IntegrityError が発生します。

これが私のmodels.pyです

class MyModel(models.Model):
    # my pk is an auto-incrementing field
    url = models.URLField("URL", unique=True)
    text = models.TextField(max_length=1000)
    # my model is just two fields, one pk (unique), and another unique field, 
    #, the url

ここで私はmanage.py sqlallです(私はsyncdbを実行しました)

CREATE TABLE `MyModel_mymodel` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
     `url` varchar(200) NOT NULL UNIQUE,
     `text` varchar(1000) NOT NULL,

しかし、manage.py シェルでは、これを自由に行うことができます。

>>> from MyModel.models import MyModel
>>> MyModel().save() # it works fine!? Not even the text was checked for!
>>> MyModel(url="blah").save() 
>>> MyModel(url="blah").save() # it still works!

# I checked the mysql database afterwards, the models were saved just fine, they
# however did have different PK's (auto incrementing fields).

私はmysql、django 1.5を使用しています。誰がこれを引き起こしている可能性があるのか​​ 考えていますか?

カスタムマネージャーを使用していますが、それが問題だとは思いません。

ありがとう。

4

3 に答える 3

49

django 1.9+
の場合、 実行すると一意の制約がsqlite3makemigrationsに適用されますmigrate

django < 1.9 の
場合 django 1.5 を使用しているため、この解決策が適用されます。

unique=Trueテーブルが既に作成された後に追加した場合、後で追加syncdbしても、一意の条件はテーブルに追加されません。

データベースに一意の制約が存在しない場合、sqlite3Django 1.5 は重複オブジェクトを喜んで保存することを確認できます。これは、ドキュメントと矛盾しているようです。MyModel(url="blah").save()

最善の解決策は、このコマンドを使用してデータベースに手動で制約を作成することです。

ALTER TABLE MyModel_mymodel ADD UNIQUE (url);

または、気にしない場合は、テーブルを再作成できます。(テーブルをドロップしてから実行しますsyncdb。)

于 2013-07-13T06:30:40.573 に答える