2012-03-15 32 views
5

Bạn đang cố gắng thiết lập và chạy trong một thời gian. Về cơ bản tôi có một phần còn lại api như phụ trợ mà trả về json, tất cả tiền phạt.fetchRelated not fetching related

Vấn đề tôi gặp phải là có quan hệ xương sống. Tôi chắc chắn rằng tôi đã có một cái gì đó sai, nhưng tôi đã được tìm kiếm trên lưới trong một thời gian và không thể tìm thấy bất cứ điều gì để giúp đỡ.

Tôi đang cố gắng có được nhiều mối quan hệ giữa mô hình "Chuyên nghiệp" và "Vũ khí". Dưới đây là mã của tôi cho rằng:

Profession = Backbone.RelationalModel.extend({ 
    urlRoot: '../api/professions', 

    relations: [{ 
     type: Backbone.HasMany, 
     key: 'weapons', 
     relatedModel: 'Weapon', 
     collectionType: 'Weapons', 
     reverseRelation: { 
      key: 'profession', 
      includeInJSON: 'id', 
      keySource: 'profession_id' 
     } 
    }] 
}); 

Weapon = Backbone.RelationalModel.extend({ 
    urlRoot: '../api/weapons' 
}); 
Weapons = Backbone.Collection.extend({ 
    model: Weapon, 

    url: function(models){ 
     return '../api/weapons'; 
    } 
}); 

Và một cuộc gọi đến những lợi điểm cuối api:

{name: "Profession1", id: 1} 

[{name: "Weapon1", profession_id: 1}, {name: "Weapon2", profession_id: 1}] 

Vì vậy, nếu tôi hiểu đúng một profession.fetchRelated('weapons') nên gửi một HttpRequest để url cho bộ sưu tập vũ khí và kéo đối tượng có một nghề nghiệp là 1. Nhưng không có gì xảy ra khi tôi chạy profession.fetchRelated('weapons')

Trả lời

9

Vì vậy, nếu tôi hiểu chính xác nghề nghiệp.fetchĐược liên kết ('vũ khí s ') nên gửi một HttpRequest để url cho bộ sưu tập vũ khí và kéo các đối tượng trong đó có một profession_id của 1. Nhưng không có gì xảy ra khi tôi chạy profession.fetchRelated (' vũ khí)

Đây không phải là cách tôi hiểu Backbone-quan hệ để làm việc - với báo trước rằng tôi đang làm việc với một phiên bản cũ hơn, và chưa điều tra các phiên bản mới nhất.

Từ hiểu biết của tôi, Backbone-relational muốn dữ liệu trông khác với phản hồi API của bạn.

Tôi nghĩ rằng Backbone quan hệ muốn tham chiếu đến các mô hình lồng nhau trong phản ứng mô hình phụ huynh, hoặc là hoàn toàn lồng nhau:

{ 
    name: "Profession1", 
    id: 1, 
    weapons: [ 
    {name: "Weapon1", profession_id: 1}, 
    {name: "Weapon2", profession_id: 1} 
    ] 
} 

Trong trường hợp này, nó sẽ cư đầy đủ các mô hình lồng nhau.

Hoặc, như tài liệu tham khảo:

{ 
    name: "Profession1", 
    id: 1, 
    weapons: ['weapon1','weapon2'] 
} 

Trong đó trường hợp Backbone quan hệ sẽ giấu các phím liên quan trong nội bộ, nhưng trình bày một bộ sưu tập trống. Sau đó bạn sẽ sử dụng fetchRelated để lấy dữ liệu đầy đủ cho các mô hình liên quan:

assassin.fetchRelated('weapons') 

nào tạo ra một yêu cầu cho vũ khí với id 'weapon1''weapon2', hoặc theo yêu cầu cá nhân, hoặc nếu API của bạn chấp nhận một yêu cầu thiết lập, một đơn yêu cầu, mong đợi một câu trả lời giống như:

{id: 'weapon1', name: "Weapon1", profession_id: 1} 

Tôi không biết, có cách nhanh chóng, tích hợp để làm việc với phản hồi API của bạn, sau đó viết một tùy chỉnh chức năng.

+0

Cảm ơn bạn đã làm rõ. Có lẽ tôi chỉ nên thay đổi các phản ứng API để bao gồm các mô hình lồng nhau như tôi muốn họ có sẵn ngay sau khi "nghề nghiệp" được lấy. – JonasFromell

+0

Vấn đề tôi gặp phải là khi bạn có hàng chục ngành nghề, mỗi ngành có hàng tá vũ khí chồng chéo hơi. Bao gồm các đối tượng vũ khí đầy đủ với mỗi nghề dẫn đến đống dữ liệu dư thừa. Thật tuyệt vời cho ví dụ nhỏ này, nhưng đối với một ứng dụng lớn, không hoàn toàn khả thi. –

2

Để thêm vào những gì Edward đã viết, dưới đây là cách bạn có thể tải fetchRelated để hoạt động. Đầu tiên, như Edward đã xác nhận, fetchRelated sẽ không trả lại gì nếu API của bạn đã lưu trữ dữ liệu trong phản hồi JSON.Vì vậy, nếu trong Django-Tastypie bạn có tài nguyên của bạn thiết lập để sử dụng đầy đủ = True:

movies = fields.ToManyField('movie.api.MovieResource', 'user', full=True) 

sau đó một cái gì đó như thế nào,

myuser.fetchRelated("movies") 

sẽ trở gì vì dữ liệu có liên quan sẽ được đưa vào trong Phản hồi JSON. Nhưng nơi tìm nạp liên quan là đặc biệt hữu ích là khi bạn đang cố gắng để làm một số tải lười biếng. Vì vậy, nếu bạn có đầy đủ = False trong lĩnh vực Django-Tastypie của bạn, và phản ứng JSON của bạn chỉ bao gồm id và tài nguyên URI để entry đó, bạn có thể sử dụng để thực sự fetchRelated cư dữ liệu đó.

myuser = new User({id: 1}) 
myuser.fetch() 
myuser.fetchRelated("movies") 

Và bây giờ bạn có quyền truy cập vào bộ sưu tập phim liên quan. Nếu bạn cũng đang sử dụng plugin Tastypie-Backbone, bạn không cần phải lo lắng về việc xây dựng một câu lệnh trả lại URL đặc biệt trong Bộ sưu tập. Nó làm tất cả cho bạn bằng cách sử dụng tastypie chọn cú pháp của/2; 3; 7