Django用户设置属性和反向关系

时间:2012-08-04 15:54:05

标签: django

我在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属性如何工作?

2 个答案:

答案 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()