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

12 投票
3 回答
23654 浏览
提问于 2025-04-16 14:34

我在使用 django.contrib.auth.models 里的 User 模型。我还有一个叫 Post 的模型,它通过外键关联到 User

问题是,当我试图通过下面的方式访问已登录用户的帖子时:

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

我遇到了一个错误,提示 User 对象没有 post_set 这个属性。那么,我该如何使用默认的认证模型和外键呢?

3 个回答

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文件,那样能给出更好的答案。

7
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
17

你有没有在你的settings.py文件中把包含Post模型的应用添加到已安装的应用列表里?

比如:

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

撰写回答