2

次のようなリンクとブックマーク モデルがあります。

class Link(models.Model):
    url = models.URLField(unique=True)        
    def __unicode__(self):
        return self.url

class Bookmark(models.Model):
    title=models.CharField(max_length=200)
    user=models.ForeignKey(User)
    link=models.ForeignKey(Link)        
    def __unicode__(self):
        return u'%s, %s' % (self.user.username, self.link.url)

ビュー内で、特定の URL を持つリンクが既に存在するかどうかを確認します。次に、このオブジェクトがユーザー名とともに Bookmarks コレクションに渡され、このユーザー名のブックマークが既に存在し、Link インスタンスが既に存在するかどうかが確認されます。

def bookmark_save_page(request):
    if request.method == 'POST':
        form = BookmarkSaveForm(request.POST)
        if form.is_valid():
            # Create or get Link
            link, dummy = Link.objects.get_or_create(url=form.cleaned_data['url'])
            # Create or get bookmark
            bookmark, created = Bookmark.objects.get_or_create(user=request.user, link=link)

            # Save bookmark to database
            bookmark.save()
            return HttpResponseRedirect('/user/%s/' % request.user.username)

これは私が理解していないビットです。比較の方法として Link モデル内の url フィールドを取得する方法をどのように知るのでしょうか? Linkモデルでこう定義していたからでしょうか。

def __unicode__(self):
        return self.url

私は .NET から来ており、インスタンスを相互に比較する方法を指定する方法として、クラスの GetHash() を定義する必要があります。

Pythonはこれをどのように知っていますか? ありがとう

4

1 に答える 1

5

「Pythonがオブジェクトを比較する方法」ではなく、「フィルタリング時にDjangoがインスタンスを比較する方法」を質問していると思います。

次のコード行で、

bookmark, created = Bookmark.objects.get_or_create(user=request.user, link=link)

Djangoはリンクオブジェクトの主キーをフィルタリングしています。方法は__unicode__関係ありません。

詳細については、関連するオブジェクトに対するオブジェクトとクエリの比較について、Djangoのドキュメントを参照してください。

于 2012-05-22T12:20:05.460 に答える