1

当后端这些属性存储在 PostgreSQL 数据库中的单独 Django 模型上时,在我的 Backbone.js 有线前端上显示来自相关对象的信息的最佳方式是什么?

我目前正在使用 Django、Tastypie、Django-Tastypie、Backbone.js、Backbone-Relational 和 Handlebars.js 模板。我愿意以不同的方式做事,如果有必要或更有效,我愿意学习 Riak 等新技术。

在前端,我尝试使用标准 Django 模板非常简单:在帖子上显示标签列表以及该帖子的作者。

在后端,我有一个Post模型和TagUserUserProfile(作者)模型。Users并且UserProfiles是一对一的,PostUserProfile但我想要显示的内容存储在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()

在 Coffeescript 中,我有我的 Backbone 模型。目前我正在尝试在初始化 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资源一样简单。然后我可以摆脱addTagsandaddAuthor函数,因为我不需要保存或更新相关对象,所以上面线程中的其余答案对我来说不是必需的。

于 2012-09-04T17:32:28.083 回答