python - queryset - Django models.py Circular Foreign Key
insert django (3)
En realidad no tienes una referencia circular; el problema es que, al momento de definir Álbum, aún no has definido Imagen. Puedes arreglar eso usando una cadena en su lugar:
class Album(models.model):
thumb = models.ForeignKey(''Image'', null=True, blank=True)
Sin embargo, en este caso, es posible que desee utilizar OneToOneField lugar de una clave externa. (Tenga en cuenta que todavía tendrá que usar el truco con la cadena).
Tengo una aplicación django que básicamente es solo un álbum de fotos. Ahora mismo tengo dos modelos: Image
y Album
. Entre otras cosas, cada Album
tiene una clave externa a una Image
para que sea su miniatura y cada Image
tiene una clave externa al Album
que pertenece. Sin embargo, cuando intento usar manage.py syncdb
o manage.py sqlall
, obtengo errores. diciendo que la clase no definida primero en models.py no está definida cuando se usa en la primera clase definida.
models.py (resumido):
from django.db import models
import os
class Album(models.Model):
thumb = models.ForeignKey(Image, null=True, blank=True)
class Image(models.Model):
image = models.ImageField(upload_to=''t_pics/images'')
thumb = models.ImageField(upload_to=''t_pics/images/thumbs'')
album = models.ForeignKey(Album)
Error que recibo cuando manage.py sqlall appname
:
[...]
File "/path/to/file/appname/models.py", line 4, in ?
class Album(models.Model):
File "/path/to/file/appname/models.py", line 5, in Album
thumb = models.ForeignKey(Image, null=True, blank=True)
NameError: name ''Image'' is not defined
Recibo el mismo error cuando cambio el orden de las clases en models.py, excepto que dice ''Album'' undefined
lugar de ''Image'' undefined
. También intenté comentar la dependencia en la primera clase y luego eliminar el comentario después de que todo lo demás se importó correctamente, pero no ayudo ¿Cómo debo hacer para que esto funcione? Me resisto a hacer un Thumb
completo de tercera clase porque tendrá una gran cantidad del mismo código que Image
También estoy bastante seguro de que podría agregar manualmente la clave externa a la base de datos, pero quiero que esté limpio y no sea pirateado.
Esto es antiguo, pero de todos modos, me gustaría decir que no veo una razón para el álbum de atributos en el modelo de imagen. En mi opinión, no es realmente necesario.
Use comillas para forzar una referencia perezosa:
models.ForeignKey(''Image'', null=True, blank=True)
Además, ForeignKey.related_name es tu amigo (evita los conflictos de nombres de referencia).