Отображение информации из объектов, связанных с Backbone.js

Каков наилучший способ отображения информации из связанных объектов на моем проводном интерфейсе Backbone.js, когда на сервере эти атрибуты хранятся в отдельных моделях Django в базе данных PostgreSQL?

В настоящее время я использую шаблоны Django, Tastypie, Django-Tastypie, 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()

В 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.


person funkotron    schedule 04.09.2012    source источник


Ответы (1)


При написании этого я нашел связанный с этим вопрос Как загрузить подмодели с отношениями внешнего ключа в Backbone.js?

Поскольку я уже написал вопрос, я решил, что могу опубликовать его, если он кому-то полезен.

Ответ был таким же простым, как добавление full=True к моим tastypie ресурсам. Затем я мог бы избавиться от функций addTags и addAuthor, и, поскольку мне не нужно сохранять или обновлять связанные объекты, остальная часть ответа в приведенном выше потоке мне не нужна.

person funkotron    schedule 04.09.2012