2012-06-20 56 views
6

Tôi đã đọc this question và câu trả lời đơn giản và rõ ràng nhưng nó không hữu ích trong trường hợp của tôi vì câu trả lời không xem xét lồng nhau for. xin vui lòng, xem mã:Giải pháp thay thế cho tài sản tham chiếu ngược trong NDB là gì?

class SuperCat(ndb.Model): 

class Category(ndb.Model): 
    supercat = ndb.KeyProperty(kind=SuperCat) 

class SubCat(ndb.Model): 
    category = ndb.KeyProperty(kind=Category) 

handler:

Categories = ndb.gql("SELECT * FROM Category WHERE supercat = :1", supercat_key) 
self.generate('supercat.html', {'Categories': Categories}) 

trong mẫu, với db.Model cũ và bất động sản trở lại tham chiếu này là đủ:

{{ for Category in Categories }} 
    {{ for SubCat in Category.subcat_set }} # this is the back-reference in action 

là gì thay thế đơn giản như nhau để phục vụ cấu trúc dữ liệu như vậy?

+0

dường như [Thuộc tính có cấu trúc] (https://developers.google.com/appengine/docs/python/ndb/properties#structured) là điểm xuất phát tốt .. –

Trả lời

11

Hãy xem xét điều này một cách có hệ thống. Thứ nhất, db->ndb translation guide cho chúng ta biết rằng các truy vấn trở về trường Agriculture cho một loại dụ được đưa ra là như sau:.

subcats_query = SubCategory.query(SubCategory.category == cat.key) 

(Lưu ý rằng tôi sử dụng tên chữ thường cho trường hợp/tổ chức và CapWords cho các lớp học/mô hình Vì vậy, mèo là một . thể loại tổ chức)

vì vậy, trong Python, chúng ta sẽ viết vòng lặp đôi của bạn như sau:

for cat in categories: 
    for subcat in SubCat.query(SubCat.category == cat.key): 
     ...blah... 

để tắt chức năng này thành một cái gì đó là dễ dàng truy cập từ template, chúng ta hãy xác định một phương pháp mới trên loại lớp:

class Category(ndb.Model): 

    supercat = ndb.KeyProperty(kind=SuperCat) 

    def subcat_set(self): 
     return SubCat.query(SubCat.category == self.key) 

Lưu ý rằng đây là một phương pháp; bằng Python, bạn phải gọi nó là:

for cat in categories: 
    for subcat in cat.subcat_set(): 
     ...blah... 

Nhưng trong một mẫu mà bạn có thể (phải) bỏ qua() Cú pháp gọi, vì vậy bạn sẽ có được những gì bạn muốn:

{{ for cat in categories }} 
    {{ for subcat in cat.subcat_set }} 
     ...blah... 

Give it a thử!

+2

hoạt động! nhưng chỉ với() trong mẫu. mà không() tôi nhận được một TypeError: đối tượng 'instancemethod' không thể lặp lại được. –

+0

Bạn đang sử dụng hệ thống mẫu nào? Tôi nghĩ rằng Django tự động gọi callables. Nhưng có lẽ Jinja2 không? Nếu bạn không thích(), bạn có thể trang trí phương thức với @property (chữ thường 'p', một Python được tích hợp sẵn). –

Các vấn đề liên quan