我正在阅读一本名为“Packt Publishing,使用Django学习网站开发”的书,我正在做一个关于如何创建书签网站的教程,用户可以在其中阅读文章并将其加入书签/将文件保存到文章中。这是models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Link(models.Model):
url = models.URLField(unique=True)
class Bookmark(models.Model):
title = models.CharField(max_length=200)
user = models.ForeignKey(User)
link = models.ForeignKey(Link)
现在,这是我的user_page视图(用户名作为参数传递给视图)
def user_page(request, username):
try:
user = User.objects.get(uesrname=username)
except:
raise Http404('Requested user not found.')
bookmarks = user.bookmark_set.all()
variables = {
'username': username,
'bookmarks': bookmarks
}
return render(request, 'user_page.html', variables)
我对这条线感到困惑
bookmarks = user.bookmark_set.all()
我理解“用户”是一个用户对象,但我们使用的是Django提供的通用用户模型,它只有用户名,密码和电子邮件,对吗?那么bookmark_set来自哪里?因为如果它试图从书签类中访问所有书签,那么bookmark_set中的'b'不应该是大写的吗? _set做了什么?在书中,它通过说
解释了这一行“要获取特定用户对象的书签列表,我们可以 方便地使用用户对象“
中可用的bookmark_set属性我尝试谷歌用户对象的所有可用属性但找不到任何东西。是否有一个网站,其中包含用户对象可用的所有属性的列表?
答案 0 :(得分:1)
bookmark_set来自Bookmark
定义,更具体地来自行
user = models.ForeignKey(User)
此行为Bookmark
模型创建用户属性,但also
为bookamrk_set
模型添加User
属性!
django documentation对此进行了解释。为了完整起见,我正在复制文档:
Django还为关系的“其他”方创建API访问器 - 从相关模型到定义关系的模型的链接。例如,Blog对象b可以通过entry_set属性访问所有相关Entry对象的列表:b.entry_set.all()。
答案 1 :(得分:1)
bookmark_set
是ForeignKey
的反向/“另一面”。您有Bookmark
到User
的FK,因此Django会自动在用户上生成bookmark_set
。
另见官方Django文档:Following relationsips "backward"
答案 2 :(得分:1)
你应该完成Django教程,解释了这一点。
bookmark_set
是在Bookmark中定义并指向User的ForeignKey的反向关系。 Django中的每个外键都有这个反向访问器,在这种情况下,它会为您提供与您拥有的特定用户对象相关的所有书签。