使用Django auth用户模型作为外键并反向关系

时间:2011-03-28 11:32:15

标签: python django

我正在使用User中的django.contrib.auth.models模型。我有另一个名为Post的模型,它通过外键引用User

问题是当我尝试通过

访问登录用户的帖子时
request.user.post_set.order_by('-timestamp')

我收到错误,User对象没有属性post_set。那么如何使用带外键的默认身份验证模型?

3 个答案:

答案 0 :(得分:17)

您是否已将包含Post模型的应用程序包含在settings.py安装的应用程序中?

e.g。

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',
)

并运行manage.py syncdb?

python manage.py syncdb

即Post模型的数据库表肯定存在吗?

我做了一个快速测试,发现没有问题:

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()
[]

答案 1 :(得分:7)

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

答案 2 :(得分:0)

它可能是由您在ForeignKey(或OneToOneField)中定义的related_name选项引起的,如果它是这样的:

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

你应该按如下方式使用它:

print(user.post.genre)

或者:

print(post.user.email)

注意:如果我能看到你的models.py和settings.py,那将是更好的答案。