python - migración al sur: "el backend de la base de datos no acepta 0 como valor para AutoField"(mysql)
django django-south (4)
Soy nuevo en django y trato de devolver una clave externa a los usuarios para un cesionario y un reportero. Pero cuando trato de aplicar el cambio con South, me da el error.
ValueError: The database backend does not accept 0 as a value for AutoField.
Mi código de modelo:
class Ticket(models.Model):
title = models.CharField(max_length=80)
text = models.TextField(blank=True)
prioritys = models.ForeignKey(Prioritys)
ticket_created = models.DateTimeField(auto_now_add=True)
ticket_updated = models.DateTimeField(auto_now=True)
assignee = models.ForeignKey(User, null=True, related_name=''assignee'')
reporter = models.ForeignKey(User, null=True, related_name=''reporter'')
def escaped_text(self):
return markdown.markdown(self.text)
def __unicode__(self):
return self.text
Hace mucho, mucho tiempo hubo un problema con Autofield.
https://code.djangoproject.com/ticket/17653
una cita interesante:
UNA:
Parece que está intentando guardar 0 en una ForeignKey que apunta a un AutoField. Pero, esto es ilegal, ya que AutoField no aceptará ese valor y, por lo tanto, ForeignKey tampoco puede mantener ese valor.
SEGUNDO:
Por lo tanto, esta solución crea otro problema cuando necesita poder aceptar un valor de 0 (o si está trabajando en una base de datos que ya tiene un valor de 0) en un campo automático. En mi caso, necesito aceptar un ID de cero para que mi clave externa pueda apuntar a cero para que una restricción única pueda funcionar correctamente.
Parece que tienes 0
en "user"."user_id"
.
Pero otra vez ... Full StackTrace, por favor ...
No estaba usando South, pero recientemente actualicé de Django 1.4 a 1.6 (con MySQL como db backend para ambos), y estaba obteniendo el mismo ValueError
al intentar guardar algunos modelos. Lo localicé hasta un campo que era un ForeignKey recursivo. Así que tuve:
class Foo(models.Model):
...
duplicate = models.ForeignKey(''self'', blank=True, null=True)
...
En algún lugar a lo largo de la línea, desafortunadamente no estoy seguro de dónde, muchos de mis objetos obtuvieron el valor de 0
para duplicate_id
.
>>> Foo.objects.filter(duplicate_id=0).count()
2078
Esto no ocurrió para ninguno de mis otros campos de ForeignKey
, solo el autorreferencial. Así que establecí los valores de ese campo en None
, y esto solucionó el error.
>>> Foo.objects.filter(duplicate_id=0).update(duplicate=None)
2078L
Debido a que este error en particular no lo señala a un campo específico que está causando problemas, en general, puede verificar si el nombre de campo del campo ForeignKey tiene algún valor 0
:
>>> Foo.objects.filter(fieldname_id=0).count()
Si esto da un resultado distinto de cero, ese campo probablemente deba ser arreglado.
Recibí el mismo error después de actualizar a django 1.7.1; se debió a que al guardar un modelo que tenía una clave externa a otro modelo que, por algún motivo, tenía un ID que se iniciaba automáticamente con 0, supongo que esto estaba permitido en versiones anteriores de django. Pero no ahora.
Si esto sucede cuando ejecuta manage.py migrate
(o manage.py syncdb
en versiones anteriores), quizás la razón sea que ha intentado agregar una clave externa a un modelo que usa AutoField como su clave principal, y use 0 como la clave principal. valor por defecto. Edite el archivo de migración y elimine el argumento default=0
en las operaciones de AddField. Funciona para mí en Django 1.10.