1

我在我的views.py 页面中使用下面的代码来呈现一个html 页面。这段代码来自一本 Django 书,我试图理解 bookmark_set 属性。

视图.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)

模型.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()

属性错误:“用户”对象没有属性“书签集”

为什么我会收到此错误?

User 的 set 属性是如何工作的?

4

2 回答 2

1

bookmark_set属性提供了一种方便的方式来遍历反向关系,即获取用户的所有书签。您可以在文档中阅读更多相关信息:

Django 还为关系的“另一端”创建 API 访问器——从相关模型到定义关系的模型的链接。例如,博客对象 b 可以通过 entry_set 属性访问所有相关条目对象的列表:b.entry_set.all()。

您实际上可以通过related_name在模型中提供 a 来指定反向关系属性的名称:

class Bookmark(models.Model):
    user  = models.ForeignKey(User, related_name="bookmarks")

$ myuser.bookmarks.all()

您是否确实通过运行在数据库中创建了模型python manage.py syncdb?看起来你做的一切都是正确的

于 2012-08-04T16:01:25.577 回答
0

我不知道为什么,但添加这个;select_related()它适用于我的情况。

user=User.object.select_related().get(id=1)
user.bookmark_set.all()
于 2019-09-13T08:20:22.320 回答