2011-03-28 11 views
12

Estoy utilizando el modelo User de django.contrib.auth.models. Tengo otro modelo llamado Post que hace referencia al User a través de una clave externa.Uso del modelo de usuario de autenticación Django como una clave foránea y relaciones inversas

El problema es cuando intento acceder a una revisión en línea a través de mensajes de usuarios

request.user.post_set.order_by('-timestamp') 

me sale un error, User objeto tiene ningún atributo post_set. Entonces, ¿cómo uso el modelo de autenticación predeterminado con claves externas?

+0

Muestra tu modelo de publicación. –

+0

A menos que tenga algún error trivial allí, una vez noté que algunos "parches de monos" específicos del modelo de Usuario llevan a que no se creen referencias. –

Respuesta

7
Post.objects.filter(user=request.user).order_by('-timestamp') 
+2

Buena solución, pero esas referencias deberían estar allí, ¿no? –

17

¿Ha incluido la aplicación que contiene el modelo de publicación en sus aplicaciones instaladas de settings.py?

p. Ej.

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'testapp' 
    # Uncomment the next line to enable the admin: 
    # 'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
) 

y ejecuta manage.py syncdb?

python manage.py syncdb 

i.e ¿la tabla de la base de datos para el modelo de publicación definitivamente existe?

Hice una prueba rápida y no encontró problemas:

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

class PostModel(models.Model): 
    user = models.ForeignKey(User) 

(test) C:\Users\Steven\django_projects\test\testproj>python manage.py shell 
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from django.contrib.auth.models import User 
>>> test = User.objects.get(username='test') 
>>> test.postmodel_set.all() 
[] 
0

puede ser causada por la opción related_name en ForeignKey (o OneToOneField) que ha definido, si es así:

user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='post') 
genre = models.CharField(max_length=100) 

se debe utilizar como abajo:

print(user.post.genre) 

O:

print(post.user.email) 

Aviso: si puedo ver su models.py y settings.py, sería una mejor respuesta.

Cuestiones relacionadas