python - variable - django templates examples
Django Ășnico=verdadero no funciona (2)
Se puede evitar ejecutar scripts SQL directamente en la base de datos. En lugar de agregar la ejecución de SQL en su migración:
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),
]
Esto es de la documentación de django:
Field.unique
Si es verdadero, este campo debe ser único en toda la tabla.
Esto se aplica en el nivel de la base de datos y mediante la validación del modelo. Si intenta guardar un modelo con un valor duplicado en un campo único, se generará un django .db.IntegrityError mediante el método save () del modelo.
Aquí están mis modelos.
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
Aquí mi es manage.py sqlall (ejecuté syncdb)
CREATE TABLE `MyModel_mymodel` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`url` varchar(200) NOT NULL UNIQUE,
`text` varchar(1000) NOT NULL,
Sin embargo, en el shell manage.py, puedo hacer esto libremente:
>>> 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).
Estoy usando mysql, django 1.5. ¿Alguien tiene una idea de lo que podría estar causando esto?
Estoy usando un administrador personalizado, pero dudo que ese sea el problema.
Gracias.
Para Django 1.9+
La ejecución de makemigrations
luego migrate
aplica la restricción única a sqlite3
Para django <1.9
Dado que está utilizando django 1.5, se aplicará esta solución.
Si agregó unique=True
después de que ya se haya creado la tabla, incluso si hace syncdb
más adelante, la condición única no se agregará a su tabla.
Puedo confirmar con sqlite3
que Django 1.5 felizmente guarda objetos duplicados con MyModel(url="blah").save()
si la restricción única no existe en la base de datos, lo que parece contradecir la documentación.
La mejor solución para usted es crear la restricción manualmente en su base de datos usando este comando.
ALTER TABLE MyModel_mymodel ADD UNIQUE (url);
O si no te importa, puedes recrear tu mesa. (Suelte la tabla y luego ejecute syncdb
.)