1

私の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シェルで実行すると、次のエラーが発生します

from django.contrib.auth.models import User
from bookmarks.models import *
user=User.object.get(id=1)
user.bookmark_set.all()

属性エラー:'ユーザー'オブジェクトに属性'bookmark_set'がありません

なぜこのエラーが発生するのですか?

ユーザーの設定属性はどのように機能しますか?

4

2 に答える 2

1

このbookmark_set属性は、逆の関係をたどる便利な方法を提供します。つまり、ユーザーのすべてのブックマークを取得します。ドキュメントで詳細を読むことができます:

Django は、関係の「反対側」の API アクセサーも作成します。つまり、関連モデルから関係を定義するモデルへのリンクです。たとえば、Blog オブジェクト b は、entry_set 属性 b.entry_set.all() を介して、関連するすべての Entry オブジェクトのリストにアクセスできます。

related_nameモデルに を指定することで、逆関係属性の名前を実際に指定できます。

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

$ myuser.bookmarks.all()

を実行して DB にモデルを確実に作成しましたpython manage.py syncdbか? すべてを正しく行っているように見えます

于 2012-08-04T16:01:25.577 に答える