2012-10-18 11 views
7

Tôi muốn nhận khóa tổ chức biết ID tổ chức và tổ tiên. ID là duy nhất trong nhóm thực thể được xác định bởi tổ tiên. Dường như với tôi rằng không thể sử dụng giao diện ndb. Như tôi hiểu kho dữ liệu, nó có thể được gây ra bởi thực tế là hoạt động này yêu cầu quét chỉ mục đầy đủ để thực hiện. Cách giải quyết mà tôi đã sử dụng là tạo thuộc tính được tính trong mô hình, phần này sẽ chứa phần id của khóa. Bây giờ tôi có thể thực hiện truy vấn tổ tiên và nhận được khóandb truy xuất khóa tổ chức theo ID không có cha mẹ

class SomeModel(ndb.Model): 
    ID = ndb.ComputedProperty(lambda self: self.key.id()) 

    @classmethod 
    def id_to_key(cls, identifier, ancestor): 
     return cls.query(cls.ID == identifier, 
         ancestor = ancestor.key).get(keys_only = True) 

Có vẻ như hoạt động, nhưng có giải pháp nào tốt hơn cho vấn đề này không?

Cập nhật Dường như đối với kho dữ liệu, giải pháp tự nhiên là sử dụng đường dẫn đầy đủ thay vì số nhận dạng. Ban đầu tôi nghĩ nó quá nặng nề. Sau khi đọc câu trả lời dragonx tôi đã thiết kế lại ứng dụng của mình. Để tôi ngạc nhiên mọi thứ trông đơn giản hơn nhiều bây giờ. Lợi ích bổ sung là các thực thể của tôi sẽ sử dụng ít không gian hơn và tôi sẽ không cần các chỉ mục bổ sung.

+0

Âm thanh như bạn có câu trả lời đúng! –

+0

ID là _không được bảo đảm duy nhất trong nhóm thực thể - chỉ cho một thực thể cha mẹ cụ thể. –

Trả lời

8

Tôi cũng gặp sự cố này. Tôi nghĩ bạn có giải pháp.

Giải pháp tốt hơn là ngừng sử dụng ID cho các đối tượng tham chiếu và lưu trữ khóa thực hoặc đường dẫn đầy đủ.

Nội bộ, tôi sử dụng các khóa thay vì ID.

Trên API còn lại của tôi, tôi đã từng làm http://url/kind/id (trong đó id trông giống như "123") để tìm nạp một thực thể. Tôi sửa đổi điều đó để cung cấp đường dẫn tổ tiên hoàn chỉnh cho thực thể: http://url/kind/ancestor-ancestor-id (789-456-123), sau đó tôi phân tích cú pháp chuỗi đó, tạo khóa và sau đó lấy khóa.

+0

Bạn nói đúng. Mọi thứ trở nên dễ dàng hơn với đường dẫn tổ tiên đầy đủ. Dường như đây là cách đúng để làm những việc như vậy trong kho dữ liệu. Cảm ơn –

+0

Đừng quên có một loại "chìa khóa" trong kho dữ liệu bạn có thể sử dụng để lưu trữ các khóa thực tế (KeyProperty). –

+0

Trong một lưu ý phụ, Java có [các phương pháp này] (https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/KeyFactory#keyToString%28com.google.appengine .api.datastore.Key% 29) để serialize và deserialize phím – aimless

3

Vì bạn có đầy đủ thông tin về tổ tiên của bạn và bạn biết id của bạn, bạn trực tiếp có thể tạo ra chìa khóa của bạn và nhận được thực thể, như sau:

my_key = ndb.Key(Ancestor, ancestor.key.id(), SomeModel, id) 
entity = my_key.get() 

Bằng cách này bạn tránh đưa ra một truy vấn mà chi phí hơn hoạt động get cả về tiền và tốc độ.

Hy vọng điều này sẽ hữu ích.

+1

Nó là một giải pháp tốt nếu tổ tiên cũng là một phụ huynh, nhưng nó không phải là trường hợp của tôi –

+0

Vì bạn đã sử dụng thuật ngữ "tổ tiên", tôi nghĩ bạn có nghĩa là nó là một phụ huynh. Nếu đây không phải là trường hợp, thì cách tiếp cận của bạn tôi nghĩ là đúng. –

1

Tôi muốn thêm một chút vào câu trả lời của dargonx.

Trong ứng dụng của tôi trên front-end Tôi sử dụng chuỗi đại diện của các phím:

str(instance.key()) 

Khi tôi cần phải thực hiện một số thay đổi với instence ngay cả khi nó là một hậu duệ tôi chỉ sử dụng chuỗi đại diện của chính nó. Ví dụ tôi có key_str - Lập luận từ yêu cầu xóa dụ ':

instance = Kind.get(key_str) 
instance.delete() 
0

Giải pháp của tôi là sử dụng urlsafe để có được item mà không cần lo lắng về id mẹ:

pk = ndb.Key(Product, 1234) 
usafe = LocationItem.get_by_id(5678, parent=pk).key.urlsafe() 
# now can get by urlsafe 
item = ndb.Key(urlsafe=usafe) 
print item