簡體   English   中英

Django unique=True 不起作用

[英]Django unique=True not working

這是來自 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 shell 中,我可以自由地這樣做:

>>> 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。 有誰知道可能導致這種情況的原因是什么?

我正在使用自定義管理器,但我懷疑這就是問題所在。

謝謝。

對於 Django 1.9+
運行makemigrations然后migrate將唯一約束應用於 sqlite3

對於 Django < 1.9
由於您使用的是 django 1.5,因此此解決方案將適用。

如果你在表已經創建后添加了unique=True ,那么即使你稍后執行syncdb ,唯一條件也不會添加到你的表中。

我可以通過sqlite3確認 Django 1.5 很樂意使用MyModel(url="blah").save()保存重復的對象,如果數據庫中不存在唯一約束,這似乎與文檔相矛盾。

最適合您的解決方案是使用此命令在數據庫中手動創建約束。

ALTER TABLE MyModel_mymodel ADD UNIQUE (url);

或者,如果您不介意,您可以重新創建您的表。 (刪除表,然后運行syncdb 。)

可以避免直接在數據庫上運行 sql 腳本。 而是在遷移中添加 sql 執行:

from __future__ import unicode_literals
from django.db import migrations, connection


def alter_table(apps, schema_editor):
    query ="ALTER TABLE <your table> ADD UNIQUE (unique_col);"
    cursor = connection.cursor()
    cursor.execute(query)
    cursor.close()

class Migration(migrations.Migration):

    dependencies = [
        ('app', 'yourlastmigration'),
    ]

    operations = [        
        migrations.RunPython(alter_table),
    ]

解決方法很簡單,按照他們的步驟就可以了。

1 - Dell all the files in the migration folder
2 - Then run the command "python manage.py makemigrations"
3 - Then run the command "python manage.py migrate"

借助一個簡單的 SQL-lite 查詢添加索引示例來完成

alter table test add index index_name(col1(255),col2(255));

添加唯一索引示例

alter table test add unique index_name(col1(255),col2(255));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM