Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] BigIntegerField autoincrementabla

Estas en el tema de BigIntegerField autoincrementabla en el foro de Python en Foros del Web. Amigos aqui con un nuevo y gran problema necesito crear un modelo cuya llave primaria debe ser un bigint auto incrementable el codigo es el ...
  #1 (permalink)  
Antiguo 12/06/2013, 09:20
 
Fecha de Ingreso: abril-2011
Mensajes: 24
Antigüedad: 13 años
Puntos: 0
Pregunta BigIntegerField autoincrementabla

Amigos aqui con un nuevo y gran problema necesito crear un modelo cuya llave primaria debe ser un bigint auto incrementable el codigo es el siguiente:

class Liga(models.Model):
id = models.BigIntegerField(primary_key=True)
nombre = models.CharField(max_length=100, null=True, default=None)

con dicho codigo crea en la base de datos (Mysql) un campo bigint primary key pero no es auto incrementable y si yo lo modifico manualmente tengo el siguiente problema

l = Liga()
l.nombre='brasil'
l.save() #con este codigo guarda excelente en la BD (1,brasil)
l.id
NONE #pero en la variable id de mi objeto se queda nulo

y necesito el id para trabajar
Investigando lei que solo las variables AutoField es el que devuelve el objeto con el id que se guarda en la base de datos y BigInteger no hace eso lo manitene nulo

Bueno amigos espero puedan aconsejarme que hacer
agradecerles de antemano

Saludos
  #2 (permalink)  
Antiguo 12/06/2013, 09:39
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: BigIntegerField autoincrementabla

Aqui hay un tema completo al respecto http://stackoverflow.com/questions/2...as-primary-key
  #3 (permalink)  
Antiguo 12/06/2013, 09:49
 
Fecha de Ingreso: abril-2011
Mensajes: 24
Antigüedad: 13 años
Puntos: 0
Respuesta: BigIntegerField autoincrementabla

muchas gracias por la pronta ayuda pero he hecho el ejemplo del link que mencionas y tengo 2 problemas
el primero es:

al agregar la libreria
from south.modelsinspector import add_introspection_rules
cuando intento ejecutar el syncdb sale el error No found module y la libreria
asi que se la he quitado
y funciona crea campo bigint auto_increment pero

Lo segundo es:
que sigo con el mismo problema cuando guardo Liga.save() y luego escribo Liga.id me muestra None

Y un nuevo error que me sale es que tengo un foreign key a dicho modelo y me sale incopatibilidad con el tipo nuevo que creo el BigAutoField

Gracias por tu ayuda seguire buscando
Saludos razpeitia
  #4 (permalink)  
Antiguo 12/06/2013, 11:01
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: BigIntegerField autoincrementabla

Primero que nada no copies y pegues sin entender el código.

Lo único que debes de hacer es tener la clase BigAutoField. Lo de south es por si quieres migraciones.

Código Python:
Ver original
  1. from django.db.models import fields
  2. class BigAutoField(fields.AutoField):
  3.     def db_type(self, connection):  # pylint: disable=W0621
  4.         if 'mysql' in connection.__class__.__module__:
  5.             return 'bigint AUTO_INCREMENT'
  6.         return super(BigAutoField, self).db_type(connection)
  #5 (permalink)  
Antiguo 12/06/2013, 11:45
 
Fecha de Ingreso: abril-2011
Mensajes: 24
Antigüedad: 13 años
Puntos: 0
Respuesta: BigIntegerField autoincrementabla

Lo he analizado me ha quedado como el ejemplo que me muestras y si crea el campo bigint auto_increment en mysql pero sigo con el problemita de que el id es nulo

ahora hay una linea de codigo en el ejemplo del link

add_introspection_rules([], ["^MYAPP\.fields\.BigAutoField"])

que agrega BigAutoField a lo fields de la aplicacion y para hacer esto en otro ejemplo he buscado que hay qe agregar el siguiente modulo

from south.modelsinspector import add_introspection_rules

y como te mensione este modulo me sale qe no existe por ello es qe comente esas dos lineas de codigo

y viendo una documentacion en de django https://code.djangoproject.com/ticket/14286 creo qe lo que dice es que esta opcion vendra en la ultima version de django y no es posible hacer bigint auto increment
"Corrigeme si me equivoco" ya que mi ingles no es bueno
  #6 (permalink)  
Antiguo 12/06/2013, 14:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: BigIntegerField autoincrementabla

Al parecer han tratado de añadir esto durante varios años, pero alguna razón no han podido.

A pesar de existir parches para esto.

http://djangosnippets.org/snippets/1244/ (Este link esta en el link que pusiste)
  #7 (permalink)  
Antiguo 12/06/2013, 14:32
 
Fecha de Ingreso: abril-2011
Mensajes: 24
Antigüedad: 13 años
Puntos: 0
Respuesta: BigIntegerField autoincrementabla

razpeitia gracias por tu tiempo se agredece.
si despues de tanto investigar creo que esa es la solucion, pero no lo veo muy confiable.
Lo que hize es obtener el ultimo id y sumarle 1
y bueno ha esperar que django implemente esa solucion

muchas gracias
Saludos
  #8 (permalink)  
Antiguo 12/06/2013, 14:42
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: BigIntegerField autoincrementabla

Cita:
Iniciado por deiby_xx Ver Mensaje
Lo que hize es obtener el ultimo id y sumarle 1
y bueno ha esperar que django implemente esa solucion
Voy a ponerte un ejemplo en github. Pero no te recomiendo esta solución por que vas a tener problemas de concurrencia. Por ejemplo 2 o mas inserts al mismo tiempo.
  #9 (permalink)  
Antiguo 12/06/2013, 15:14
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: BigIntegerField autoincrementabla

Bueno como lo prometí aquí esta un repo con un ejemplo funcionando.

Le tuve que hacer unos cambios al snippet y añadir algo de soporte para sqlite3 pero funciona.

Lo provee con Sqlite3 y MySQL y funciono perfectamente.

https://github.com/razpeitia/BigIntegerAutoFieldExample

Ejemplo de uso en la terminal:

Código:
python manage.py shell
Código Python:
Ver original
  1. from myapp.models import VeryLargeModel, ReferencingModel
  2.  
  3. a = VeryLargeModel(data='a')
  4. a.save()
  5. a.id # 1

Igual puedes comprobar con:
Código:
python manage.py sqlall myapp
Y veras que arroja en MySQL:

Código MySQL:
Ver original
  1. CREATE TABLE `myapp_verylargemodel` (
  2.     `data` longtext NOT NULL
  3. )
  4. ;
  5. CREATE TABLE `myapp_referencingmodel` (
  6.     `target_id` bigint NOT NULL,
  7.     `more_data` longtext NOT NULL
  8. )
  9. ;

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:24.