14

ReferenceProperty rất hữu ích trong việc xử lý các tham chiếu giữa hai mô-đun. Fox dụ:db.ReferenceProperty() vs ndb.KeyProperty trong App Engine

class UserProf(db.Model): 
    name = db.StringProperty(required=True) 

class Team(db.Model): 
    manager_name = db.ReferenceProperty(UserProf, collection_name='teams') 
    name = db.StringProperty(required=True) 
  • Để có được 'MANAGER_NAME' với dụ đội bóng, chúng tôi sử dụng team_ins.manager_name.
  • Để nhận 'các nhóm' được quản lý bởi cá thể người dùng cụ thể, chúng tôi sử dụng user_instance.team và lặp lại.

Trông nó có dễ dàng và dễ hiểu không?

Khi làm điều tương tự sử dụng NDB, chúng ta phải sửa đổi

db.ReferenceProperty (UserProf, collection_name = 'đội') -> ndb.KeyProperty (loại = UserProf)

  • team_ins. manager_name.get() sẽ cung cấp cho bạn tên người quản lý
  • để có được tất cả các đội bóng mà là máng cỏ bằng cách dùng cụ thể, chúng ta phải làm

    cho đội trong Team.query (Team.manager_name == user_ins.key): (Định dạng mới là không làm việc ở đây)

    print "team name:", team.name 
    

Như bạn thấy xử lý các loại kịch bản trông dễ dàng hơn và có thể đọc được trong db hơn NDB.

  • Lý do xóa ReferenceProperty trong ndb là gì?
  • Ngay cả truy vấn của người dùng db user_instance.teams cũng sẽ làm điều tương tự như được thực hiện trong vòng lặp của ndb. Nhưng trong ndb, chúng tôi đang đề cập một cách rõ ràng sử dụng cho vòng lặp.
  • Điều gì đang xảy ra sau hậu trường khi chúng tôi thực hiện user_instance.teams?

Thanks in advance ..

Trả lời

26

Tim giải thích rõ.Chúng tôi thấy rằng một mô hình chống phổ biến đã sử dụng các thuộc tính tham chiếu và tải chúng một lần, vì ký hiệu "entity.property1.property2" không làm rõ rằng dấu chấm đầu tiên gây ra hoạt động "get" cơ sở dữ liệu. Vì vậy, chúng tôi đã làm rõ hơn bằng cách buộc bạn viết "entity.property1.get(). Property2" và chúng tôi đã làm cho việc thực hiện tìm nạp trước hàng loạt dễ dàng hơn (không có giải pháp phức tạp từ blog của Nick) bằng cách chỉ cần nói "entity.property1.get_async() "cho một loạt các thực thể - hàng đợi này một lô duy nhất có được hoạt động mà không bị chặn cho kết quả, và khi bạn tham chiếu tiếp theo bất kỳ thuộc tính nào bằng cách sử dụng" entity.property1.get(). property2 " có được hoạt động nhưng chỉ chờ đợi cho lô đó có được để hoàn thành (và lần thứ hai bạn làm điều này, lô nhận được là đã hoàn thành). Ngoài ra cách thức này trong quá trình và tích hợp memcache đến miễn phí.

+0

Cảm ơn. ndb cũng giống như db nhưng rõ ràng và người dùng sẽ biết rằng có hoạt động get(). Không có cải thiện hiệu suất trong trường hợp này. Tôi đã đọc về ndb async, chưa sử dụng nó. – rajpy

+3

@Tim và Guido, Bạn có thể đề xuất bất kỳ ứng dụng mẫu nào được viết bằng ndb tương tự như ứng dụng mẫu trong http://code.google.com/p/google-app-engine-samples/. Và cũng thực hành tốt nhất để làm theo trong các ứng dụng dựa trên ndb. Nó sẽ giúp đỡ rất nhiều. Cảm ơn. – rajpy

+0

Gọi 'entity.keyproperty.get(). Somevalue1' sẽ tìm nạp đối tượng được tham chiếu bởi' keyproperty' lần đầu tiên, trong 'entity.keyproperty.get() sau đó' somevalue2' và 'entity.keyproperty.get(). Somevalue3' sẽ không thực hiện cuộc gọi db ??? –

7

Tôi không biết câu trả lời là tại sao Guido đã không thực hiện bất động sản tham khảo.

Tuy nhiên tôi thấy đã dành rất nhiều thời gian sử dụng pre_fetch_refprops http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine (tìm nạp trước tất cả thuộc tính tham chiếu bằng cách lấy tất cả các khóa bằng get_value_for_datastore) và sau đó thực hiện get_multi trên các phím.

Điều này hiệu quả hơn rất nhiều.

Ngoài ra nếu đối tượng được tham chiếu không tồn tại, bạn sẽ gặp lỗi khi cố tìm nạp đối tượng.

Nếu bạn chọn một đối tượng có tham chiếu bạn đã chọn nhiều hơn bạn có thể đã lên kế hoạch. Vì vậy, tôi tìm thấy ngoại trừ trường hợp một, nơi bạn có thực thể duy nhất và bạn muốn lấy đối tượng được tham chiếu với accessname kiểu .name bạn phải nhảy qua tất cả các loại hoops để ngăn chặn thực thể được tham chiếu được tìm nạp.

+0

Cảm ơn. Hy vọng bản thân Guido sẽ trả lời câu hỏi này.! :) – rajpy

+0

Tim, cảm ơn vì liên kết. Tìm nạp trước được thực hiện dễ dàng hơn trong ndb. – rajpy