2010-08-11 96 views
9

Một mô hình mẫu:Truy vấn cho một giá trị hiện tại sở hữu danh sách của một mô hình trong AppEngine

class Foo(db.Model): 
    id = db.IntegerProperty() 
    bar = db.ListProperty(int, required=True) 
  1. Làm thế nào tôi có thể truy vấn bằng cách sử dụng truy vấn hoặc GqlQuery trả lại tất cả Foo thực thể có một giá trị nhất định trong số thanh tài sản của họ?

  2. Nếu tôi có danh sách các id, có một bộ lọc nào sẽ trả về tất cả các thực thể có thuộc tính id nằm trong danh sách đó không?

Trả lời

7

1.

Nếu bạn sử dụng một bằng truy vấn trên một tài sản danh sách, nó sẽ kiểm tra tất cả các mục trong danh sách:

search = 2 
results = Foo.all().filter('bar =', search).fetch() 

2.

Bạn có thể sử dụng một IN bộ lọc, nhưng lưu ý rằng nội bộ này làm cho một truy vấn datastore cho mỗi mục trong danh sách, do đó, nó có thể được làm chậm, và cũng có tối đa 30 truy vấn nội bộ cho mỗi yêu cầu.

items = [1, 2, 3] 
results = Foo.all().filter("id IN", items).fetch() 

Xem Introducing Queries để biết chi tiết cho cả 1 và 2, và ListProperty để biết thêm chi tiết về 1.

2

Đối với những người bạn thích tôi người không thể có được câu trả lời ở trên để làm việc.

Sử dụng gae phiên bản 1.5.3

results = Foo.all().filter('bar =', search).fetch() 

mang đến cho không có kết quả. Nhưng

results = Foo.all().filter('bar =', search).fetch(100) 
results = Foo.all().filter('bar =', search) 

cho kết quả.

0

Ngoài ra bạn cũng có thể sử dụng GQL .. này có thể là một sự phát triển đã xảy ra trong thời gian kể từ khi câu hỏi được hỏi

Đối với câu hỏi 1

wheres = 2 
pageSize = 10 
qry = db.GqlQuery("SELECT * FROM Foo WHERE bar = :1", wheres) 
Foos = qry.fetch(pageSize) 

Đối với câu hỏi 2

wheres = [ 1, 3, 44, 101 ] 
pagesize = 10 
qry = db.GqlQuery("SELECT * FROM Foo WHERE bar IN (:1)", wheres) 
Foos = qry.Fetch(pageSize) 

Xem ra cho truy vấn trong, mặc dù. Nó thực sự sẽ thực hiện N truy vấn phụ (một cho mỗi phần tử trong mệnh đề IN của bạn). Đây là tài liệu Gql: https://developers.google.com/appengine/docs/python/datastore/gqlreference