我在views.py页面中使用以下代码来渲染html页面。这段代码来自Django书,我试图理解bookmark_set属性。
views.py
def user_page(request, username):
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise Http404(u'Requested user not found')
bookmarks = user.bookmark_set.all()
template = get_template('user_page.html')
variables = Context({'username':username, 'bookmarks':bookmarks})
output = template.render(variables)
return HttpResponse(output)
models.py
from django.db import models
from django.contrib.auth.models import User
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)
当我在Python shell中运行这段代码时,我收到以下错误
from django.contrib.auth.models import User
from bookmarks.models import *
user=User.object.get(id=1)
user.bookmark_set.all()
属性错误:'用户'对象没有属性'bookmark_set'
为什么我会收到此错误?
用户的set属性如何工作?
答案 0 :(得分:1)
bookmark_set
属性提供了一种方便的方法来遍历反向关系,即获取用户的所有书签。您可以阅读更多相关信息in the docs:
Django还为关系的“其他”方创建API访问器 - 从相关模型到定义关系的模型的链接。例如,Blog对象b可以通过entry_set属性访问所有相关Entry对象的列表:b.entry_set.all()。
您可以通过在模型中提供related_name
来实际指定反向关系属性的名称:
class Bookmark(models.Model):
user = models.ForeignKey(User, related_name="bookmarks")
$ myuser.bookmarks.all()
您是否确实通过运行python manage.py syncdb
在数据库中创建了模型?看起来你正在做的一切正确
答案 1 :(得分:0)
我不知道为什么,但是加上这个; select_related()
适用于我的情况。
user=User.object.select_related().get(id=1)
user.bookmark_set.all()