当这些属性存储在PostgreSQL数据库中的单独Django模型上时,在我的Backbone.js有线前端上显示相关对象信息的最佳方式是什么?
我目前正在使用Django、Tastypie、Django Tastypi、Backbone.js、Backbone Relational和Handlebars.js模板。我对以不同的方式做事持开放态度,如果有必要或更高效,我愿意学习Riak等新技术。
在前端,我试图用标准Django模板做的事情非常简单:显示帖子上的标签列表和该帖子的作者。
在后端,我有一个Post
模型和Tag
、User
和UserProfile
(作者)模型。Users
和UserProfiles
是1对1,Post
与UserProfile
有关系,但我想显示的内容存储在User
模型上的属性username
下。目前,这涉及到两个艰苦的查找,以获得每一篇文章的作者用户名。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()
在Coffeescept中,我有我的骨干模型。目前,我正在尝试在初始化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
模板中。
在写这篇文章时,我发现了一个相关的问题:如何在Backbone.js中加载具有外键关系的子模型?
既然我已经写了这个问题,我想我还不如把它发布出来,以防对任何人有用。
答案很简单,只需将full=True
添加到我的tastypie
资源中即可。然后我就可以去掉addTags
和addAuthor
函数,因为我不需要保存或更新相关对象,所以上面线程中的其余答案对我来说是不必要的