8

Tôi có một kịch bản đơn giản trong đó có một lớp người dùng có tên, email và thuộc tính người theo dõi.Sử dụng ndb.KeyProperty cách tham chiếu cùng một mô hình?

class User(ndb.Model): 
    name = ndb.StringProperty(required = True) 
    search_name = ndb.StringProperty(required = True) 
    pw_hash = ndb.StringProperty(required = True) 
    email = ndb.StringProperty() 

    follows = ndb.KeyProperty(Follow, repeated=True) 
    followers = ndb.KeyProperty(User, repeated=True) 

Trong khi thực hiện điều này, tôi gặp phải lỗi.

File "C:\ujjal\my project\cravel\code2\Users.py", line 46, in User 
    followers = ndb.KeyProperty(User, repeated=True) 
NameError: name 'User' is not defined 
INFO  2012-09-11 11:45:23,953 dev_appserver.py:2967] "GET/HTTP/1.1" 500 - 

Bất kỳ đề xuất nào về cách mô hình thuộc tính "người theo dõi" sẽ được đánh giá cao. Cảm ơn trước

Trả lời

29

Sử dụng một loại trên một tài sản e.g. some_prop = ndb.KeyProperty(User) chìa khóa duy nhất thực thi mà các loại chìa khóa phải có loại tài khoản. Vì vậy, bạn vẫn có thể sử dụng một KeyProperty mà không có một loại nếu cần thiết.

Tuy nhiên, nếu bạn muốn thực thi tất cả các phím đi theo phải có loại tài khoản (bên trong mô hình tài khoản) sau đó bao quanh loại với dấu ngoặc kép:

followers = ndb.KeyProperty(kind='User', repeated=True) 

Nó giải thích một chút tốt hơn trong ndb cheat sheet

+0

Hoàn hảo, @Bert cảm ơn cho đầu vào của bạn – ujjalcal

+0

Vấn đề này không phải là cụ thể. Bạn không thể tham chiếu một lớp theo kiểu của nó cho đến sau khi lớp được định nghĩa. Đó là lý do tại sao ndb cho phép bạn sử dụng một tên chuỗi cho một loại hoặc đối tượng kiểu python. –

2

Nếu bạn chỉ muốn "tín đồ" là một KeyProperty sau đó chỉ cần đặt:

followers = ndb.KeyProperty(repeated=True) 

hay, những gì tôi nghĩ rằng bạn là sau đó, để xác định các loại chìa khóa.

follows = ndb.KeyProperty(kind=User,repeated=True) 

Tôi nghĩ bạn chỉ thiếu kind=User có thể.

https://developers.google.com/appengine/docs/python/ndb/properties#types

+0

Tôi đã thử 'loại = Người dùng' nhưng nó không hoạt động. Người đầu tiên làm việc mặc dù. Nhưng vẫn không rõ tại sao 'type = User' hoặc đơn giản' User' không hoạt động. – ujjalcal

+0

Cá nhân tôi muốn tránh sử dụng Người dùng làm tên. Nó có quá nhiều tiềm năng để đụng độ. Đề xuất đổi tên, thử lại. Nhưng sử dụng loại chỉ đảm bảo rằng khi bạn chỉ định một chìa khóa đó là loại đặc biệt đó. Bạn cũng có thể đặt tên của mô hình trong dấu ngoặc kép như một chuỗi, nó không quan trọng mà bạn sử dụng trong thực tế vì vậy hãy thử điều đó cũng có. –

+0

cảm ơn cho đầu vào của bạn. Bạn là chính xác, bằng cách đặt loại trong '' giải quyết vấn đề. Một điều mà tôi không nhận được là bình luận của bạn ** Cá nhân tôi muốn tránh sử dụng User như một cái tên. Nó có quá nhiều tiềm năng để đụng độ ** Bạn có thể giải thích thêm một chút không? – ujjalcal

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