1

當在後端將Backbone.js有線前端上的相關對象的信息顯示出來時,這些屬性存儲在PostgreSQL數據庫的單獨Django模型中是什麼?顯示來自Backbone.js相關對象的信息

我目前正在使用Django,Tastypie,Django-Tastypie,Backbone.js,Backbone-Relational和Handlebars.js模板。我願意以不同的方式做事,我願意學習像Riak這樣的新技術,如果它是必要的或更高效的。

在前端,我試圖做的事情對標準Django模板來說非常簡單:在帖子和該帖子的作者上顯示標籤列表。

在後端我有一個Post模型和TagUserUserProfile(作者)模型。 UsersUserProfiles是1比1,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模板中。

回答

2

當寫這個,我發現的相關問題How do I load sub-models with a foreign key relationship in Backbone.js?

既然我已經寫我想我可能也張貼的情況下,它是有用的人的問題。

答案和將full=True添加到我的tastypie資源一樣簡單。然後,我可以擺脫addTagsaddAuthor函數,因爲我不需要保存或更新相關對象,所以在上述線程中的其他答案對我來說不是必需的。