バックエンドでこれらの属性が PostgreSQL データベースの個別の Django モデルに格納されている場合、Backbone.js 有線フロントエンドで関連オブジェクトからの情報を表示する最良の方法は何ですか?
現在、Django、Tastypie、Django-Tastypie、Backbone.js、Backbone-Relational、Handlebars.js テンプレートを使用しています。私は物事を違ったやり方で行うことにオープンであり、Riak などの新しいテクノロジーが必要であったり、より効率的であったりする場合は、喜んで学びます。
フロントエンドで私がやろうとしていることは、標準の Django テンプレートを使用すると非常に簡単です: 投稿のタグとその投稿の作成者のリストを表示します。
バックエンドには、Post
モデルとTag
、User
およびUserProfile
(作成者) モデルがあります。Users
とUserProfiles
は 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
さらに、保存されたタグ名にアクセスしてテンプレートに表示する方法がわかりません。