1

バックエンドでこれらの属性が PostgreSQL データベースの個別の Django モデルに格納されている場合、Backbone.js 有線フロントエンドで関連オブジェクトからの情報を表示する最良の方法は何ですか?

現在、Django、Tastypie、Django-Tastypie、Backbone.js、Backbone-Relational、Handlebars.js テンプレートを使用しています。私は物事を違ったやり方で行うことにオープンであり、Riak などの新しいテクノロジーが必要であったり、より効率的であったりする場合は、喜んで学びます。

フロントエンドで私がやろうとしていることは、標準の Django テンプレートを使用すると非常に簡単です: 投稿のタグとその投稿の作成者のリストを表示します。

バックエンドには、PostモデルとTagUserおよびUserProfile(作成者) モデルがあります。UsersUserProfilesは 1 対 1 でPost、関係がありUserProfileますが、表示したいものUserは属性の下のモデルに格納されていますusername。現時点では、すべての投稿の作成者のユーザー名を取得するために、2 つの骨の折れる検索が必要です。Postモデル:

class Post(models.Model):
    author = models.ForeignKey(UserProfile)
    topic = models.ForeignKey(Topic)
    tags = models.ManyToManyField(Tag)
    content = models.TextField()
    title = models.CharField(max_length=250)
    slug = models.SlugField()
    description = models.TextField()

Coffeescript には、バックボーン モデルがあります。現在、Post モデルの初期化時に、関連する作成者とタグ オブジェクトを取得しようとしています。私の現在のコードは非常にずさんです。申し訳ありませんが、JavaScript foo はまだ開発中です!

class User extends Backbone.RelationalModel
class UserProfile extends Backbone.RelationalModel
    urlRoot : '/api/v1/profile/?format=json'
class PostTag extends Backbone.RelationalModel
    initialize: ->
        this.get('tag').on 'change', ( model ) =>
            this.get( 'post' ).trigger( 'change:tag', model )
class Tag extends Backbone.RelationalModel
    urlRoot: '/api/v1/tag/?format=json'
    idAttribute: 'id',
    relations: [{
        type: Backbone.HasMany,
        key: 'post_tags',
        relatedModel: PostTag,
        reverseRelation: {
            key: 'tag',
            includeInJSON: 'id',
        },
    }],

class Post extends Backbone.RelationalModel
    idAttribute: 'id',
    relations: [{
        type: Backbone.HasMany,
        key: 'post_tags',
        relatedModel: PostTag,
        reverseRelation: {
            key: 'post',
            includeInJSON: 'id',
        },
    }]
    initialize: ->
        @.get('tags').forEach(@addTag, @)
        @.addAuthor()
        @.on 'change:tag', (model) ->
            console.log('related tag=%o updated', model)
    addAuthor: () ->
        profile_id = @.get('author')
        if app.UserProfiles.get(profile_id)?
            profile = app.UserProfiles.get(profile_id)
            user = app.Users.get(profile.user)
            @.set('author_name',user.get('username'))
        else
            profile = new app.UserProfile(profile_id)
            app.UserProfiles.add(profile)
            profile.fetch(success: (model,response) =>
                user_id = profile.get('user')
                if app.Users.get(user_id)?
                    user = app.Users.get(user_id)
                    user.fetch(success: (model,response) =>
                        console.log(user.get('username'))
                        @.set('author_name',user.get('username'))
                    )
                    console.log("Existing user"+user_id)
                    console.log(user.get('username'))
                    #@.set('author_name',user.get('username'))
                else
                    user = new app.User('resource_uri':user_id)
                    app.Users.add(user)
                    console.log("New user"+user_id)
                    user.fetch(success: (model,response) =>
                        console.log(user.get('username'))
                        @.set('author_name',user.get('username'))
                    )
            )

    addTag: (tag_id) ->
        console.log(tag_id)
        if app.Tags.get(tag_id)?
            tag = app.Tags.get(tag_id)
            console.log("TAG" + tag)
        else
            console.log("NON EXISTENT")
            console.log(tag_id)
            tag = new app.Tag({'id':tag_id})
            tag.fetch()
            app.Tags.add(tag)
        post_tag = new app.postTag({
            'tag': tag_id,
            'post': @.get('resource_uri')
            })
        @.get('post_tags').add(post_tag)

このコードは、実際には関連オブジェクトの取得と保存には問題なく機能しますが、非常に面倒で、もっと良い方法があるに違いないと確信しています。Handlebars.jsさらに、保存されたタグ名にアクセスしてテンプレートに表示する方法がわかりません。

4

1 に答える 1

2

これを書いているときに、Backbone.js で外部キー関係を持つサブモデルをロードするにはどうすればよいですか?という関連する質問を見つけました。

私はすでに質問を書いていたので、誰にとっても役立つ場合に備えて投稿してもよいと思いました.

full=True答えは、私のtastypieリソースに追加するのと同じくらい簡単でした。addTagsその後、 and関数を取り除くことができましaddAuthorた。関連するオブジェクトを保存または更新する必要がないため、上記のスレッドの残りの回答は必要ありませんでした。

于 2012-09-04T17:32:28.083 に答える