2013-02-18 34 views
10

Đây là về ndb của Google App Engine. Theo quan sát của tôi, nếu tôi tạo một thực thể mà không cung cấp bất kỳ khóa nào, thực thể sẽ có một số nguyên, bắt đầu bằng 1 và được gia tăng, trong trường ID như được hiển thị trong Trình xem Datastore. Tuy nhiên, nếu tôi tạo đối tượng bằng cách cung cấp một chuỗi làm id của nó, thực thể sẽ có một chuỗi trong trường Key Name. Ví dụ:ndb của công cụ ứng dụng Google: sử dụng id hoặc tên khóa?

mẫu:

class Member(ndb.Model): 
    ... 

chương trình:

member1 = Member()   # --> ID is 1, Key Name is None 
member2 = Member(id='abc') # --> ID is empty, Key Name is 'abc' 

Bên cạnh đó, trong file html, nếu tôi sử dụng

<input ... name="id" value={{member1.key.id}} ... /> 

như một tham số để trở về chương trình phía máy chủ (Python), không một trong hai câu lệnh sau đây sẽ làm việc cho thành viên1:

Member.get_by_id(self.request.get('id')) 
member1 = Member.get_by_id(int(self.request.get('id'))) 

Tuy nhiên, html và chương trình mã sau:

<input ... name="id" value={{member2.key.id}} ... /> 
member2 = Member.get_by_id(self.request.get('id')) 

sẽ làm việc cho member2.

Có vẻ như không có vấn đề gì với các thực thể được tạo bằng cách cung cấp cùng với id chuỗi (ví dụ: member2). Nhưng điều tương tự cũng không hiệu quả đối với member1. Câu hỏi của tôi: a) Các quan sát của tôi có đúng không? b) Làm cách nào để tìm nạp member1 bằng cách sử dụng get_by_id()?

+0

Bạn đã lấy tất cả các thành viên và kiểm tra phím của họ để bạn biết 1. rằng bạn có trong thực tế bằng văn bản member1 và member2? và –

+0

2. phím nào bạn đã thực sự tạo ra –

Trả lời

13

a) Chủ yếu là chính xác, mặc dù bạn sẽ có thể nhận được member1 thông qua phương pháp thứ hai bạn đã hiển thị. Cũng không thể xác minh rằng các số nguyên ID luôn luôn bắt đầu ở 1 và sẽ luôn luôn được gia tăng. Tôi đã nhìn thấy kết quả hỗn hợp liên quan đến điều đó.

b) member1 = Member.get_by_id(int(self.request.get('id'))) nên làm việc

Bạn cũng có thể thử sử dụng key.urlsafe() vì vậy bạn không cần phải lo lắng về việc chuyển đổi id chính:

<input ... name="id" value={{member.key.urlsafe()}} ... />

member_key = self.request.get('id') 
member = ndb.Key(urlsafe=member_key).get() 
+3

Cảm ơn bạn đã xác nhận một số quan sát của tôi. Sau nhiều thử nghiệm, tôi có kết luận sau. Nếu một thực thể được tạo mà không có id (ví dụ, 'member1 = Member()'), thì ID của nó là một số nguyên và có thể được tìm nạp bởi 'member1 = Member.get_by_id (int (self.request.get ('id'))) '. Tuy nhiên, nếu một thực thể được tạo ra với một id (ví dụ, 'member2 = Member (id = 'abc')'), thì đó là Key Name là 'abc', và nó có thể được tìm nạp bởi 'member2 = Member.get_by_id (self .request.get ('id')) '. Cả hai đều sử dụng cùng một biến mẫu trong HTML: '{{member1.key.id}} và {{member2.key.id}}' –

+0

Có an toàn khi chuyển đổi số dài từ allocate_id thành int? Hoặc nó sẽ là posible để cắt ngắn số nguyên trong chuyển đổi? – ccsakuweb

+0

+1 cho đề xuất urlsafe, khắc phục sự cố cho tôi! :) –

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