widgets variable template fields examples example python django

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 .)