2012-05-31 16 views
6

Tengo una carpeta de modelos que tiene algunos modelos en archivos que ya están en la base de datos. Acabo de agregar otro archivo/modelo pero no se agrega a la base de datos cuando ejecuto syncdb. He intentado con manage.py validate y funciona bien. También he ejecutado el código y solo falla cuando intenta guardar con "table does not exists".Modelos de Django que no aparecen en DB después de syncdb

la estructura original fue así:
/modelos
- __ __ init .py
- file1.py
- file2.py

y __ init __ .py se parecía a:

from file1 import File1Model 
from file2 import File2Model 

I añadió file3.py
/modelos
- __ init __ .py
- file1.py
- file2.py
- file3.py

y modificar __ init __ .py

from file1 import File1Model 
from file2 import File2Model 
from file3 import File3Model 

Y el contenido del archivo3 (los nombres pueden haber sido cambiados para proteger a los inocentes, pero además de eso es el archivo exacto):
ACTUALIZACIÓN: acabo de intentar agregar una clave principal ya que el campo de id puede haber estado jugando entero de la clave principal id. También probé algunas variaciones pero no dados.

from django.db import models 
from django.contrib.auth.models import User 


class File3Model(models.Model): 
    user = models.OneToOneField(User) 
    token = models.CharField(max_length=255, blank=False, null=False) 
    id = models.CharField(primary_key=True, max_length=255) 

    class Admin: 
     pass 

    class Meta: 
     app_label = 'coolabel' 

    def __unicode__(self): 
     return self.user.username 

    @staticmethod 
    def getinstance(user, token, id): 
     try: 
      instance = File3Model.objects.get(pk=id) 
      if instance.token != token: 
       instance.token = token 
       instance.save() 
      return instance 
     except: 
      pass 
     instance = File3Model() 
     instance.user = user 
     instance.token = token 
     instance.id = id 
     instance.save() 
     return instance 

lo tanto, en este ejemplo, File1Model y File2Model ya están en la base de datos y se mantienen en el PP después de syncdb. Sin embargo, File3Model no se agrega incluso después de volver a ejecutar syncdb. ¿Hay alguna manera de descubrir por qué el nuevo modelo no se está agregando?

+0

¿Has probado 'syncdb --all'? – sultan

+0

acaba de probar, pero todavía no está funcionando. – ntrrobng

Respuesta

0

BOOM!

Estaba usando una app_label diferente para el nuevo modelo, pero tiene que ser la misma en todo el grupo modelo.

Las otras etiquetas de los modelos eran "mediocrelabel" y mi nuevo modelo tenía la etiqueta "coolabel". Cambié la etiqueta del nuevo modelo a "mediocrelabel" y ahora se están agregando correctamente a la base de datos.

¡Gracias por su ayuda, amigos!

9

Si define el modelo fuera de models.py, tiene que establecer el atributo app_label en la clase de modelos Meta.

Editar: El app_label tiene que hacer referencia a una aplicación en su configuración INSTALLED_APPS. Probablemente debería coincidir con el nombre de la aplicación en la que se encuentra el directorio de modelos, a menos que tenga una buena razón para hacer lo contrario. Ese parece ser tu problema aquí.

class File3Model(models.Model): 
    foo = models.CharField(...) 
    ... 

    class Meta: 
     app_label = "my_app" 

Tenga en cuenta que syncdb nunca eliminará ninguna tabla de la base de datos. Las otras tablas probablemente se crearon con syncdb antes de que models.py se reemplazara con la estructura del directorio.

+0

El campo app_label se establece en la clase Meta pero aún no se agrega a la base de datos. – ntrrobng

+0

La 'app_label' tiene que ser una aplicación en su configuración' INSTALLED_APPS'. He agregado esto a la respuesta. – Alasdair

0

¿Por qué dividiste los modelos y teniendo una carpeta de modelos en lugar de colocar los modelos en models.py?

En mi propio proyecto hay aproximadamente 10 modelos en vivo en models.py y estoy de acuerdo.

También puedes probar manage.py syncdb --all.

Y creo que es mejor mantener todos los modelos en un solo archivo e importarlos como from my_app.models import model_name en lugar de tener en cuenta importar el modelo necesario en models/__init__.py. Por cierto, evitas muchos problemas y largas importaciones y no te importa dónde some_model vive entre models/*.py archivos.

Gracias,

Sultan

+0

Gracias por su consejo. Sin embargo, estoy trabajando con el código existente y pensé que sería una tontería volver a mover todo al archivo models.py. Preferiría mantener todo en el directorio de modelos. – ntrrobng

1

establecer app_label en mi aplicación resuelve mi problema.

Cuestiones relacionadas