2012-04-18 16 views
8

Tôi đang cố gắng tạo mô hình ndb trong đó mỗi bản ghi có một trường "tên" duy nhất. Tôi muốn xác định trường này là trường key_name và sử dụng nó để tra cứu các bản ghi. Tôi có phải bao gồm một trường tên hoặc bằng cách nào đó tôi có thể đặt trường key_name thành một chuỗi tùy ý mà người dùng có thể chỉ định miễn là nó là duy nhất?Cách tốt nhất để chỉ định một key_name cho Mô hình NDB của App Engine là gì?

Tôi đang nghĩ đến việc sử dụng Model.get_or_insert để đảm bảo rằng các bản ghi cũ không bị ghi đè, nhưng có cách nào để biết liệu giá trị trả lại có được tạo mới hoặc có sẵn không? Tôi muốn có thể hiển thị thông báo lỗi nếu người dùng nhập tên trùng lặp.

Cuối cùng, tôi đã cố gắng tạo trường key_name trên mô hình DjangoForms sử dụng mô hình ndb ở trên làm metaclass vì vậy tôi có thể sử dụng djangoforms để xác thực/kết xuất nhưng vì một số lý do mà trường đã xác định của tôi không hiển thị.

lớp UserProfileForm (djangoforms.ModelForm): KEY_NAME = djangoforms.StringProperty() lớp Meta: mô hình = UserProfile

+1

Bạn nên thực sự đặt câu hỏi riêng cho từng câu hỏi này, thay vì gộp chúng lại với nhau. –

Trả lời

14

Tôi có phải bao gồm một trường tên hoặc tôi có thể bằng cách nào đó thiết lập các lĩnh vực KEY_NAME đến một chuỗi tùy ý mà người dùng có thể chỉ định miễn là nó là duy nhất?

Bạn có thể chuyển tên khóa duy nhất của mình làm thông số id cho trình tạo mô hình: profile = UserProfile(id='my_unique_name').

Tôi đang nghĩ đến việc sử dụng Model.get_or_insert để đảm bảo rằng các hồ sơ cũ không bị ghi đè, nhưng là có một cách để biết được giá trị trả về là mới được tạo ra hoặc tồn tại trước đó? Tôi muốn có thể hiển thị thông báo lỗi nếu người dùng nhập tên trùng lặp.

Sử dụng Model.get_by_id(). Nó sẽ trở lại một trường hợp mô hình hoặc None nếu một mô hình không được tìm thấy:

profile = UserProfile.get_by_id('my_unique_name') 
if profile: 
    # display error message saying that the user already exists. 

Cuối cùng, tôi đã cố gắng để tạo ra một lĩnh vực KEY_NAME trên một mô hình DjangoForms rằng sử dụng mô hình NDB trên như metaclass vì vậy tôi có thể sử dụng djangoforms để xác nhận/kết xuất nhưng vì một số lý do các trường được xác định của tôi không hiển thị.

Tôi không biết DjangoForms hoạt động như thế nào, nhưng rất có thể chúng không tương thích với NDB. Bạn sẽ muốn tạo logic xác nhận của riêng bạn.

+1

Giải pháp của bạn cho phần 2 sẽ không hoạt động nếu anh ta muốn tạo người dùng giao dịch nếu nó chưa tồn tại - một giao dịch được yêu cầu cho điều đó. –

+0

@NickJohnson bạn sẽ đề xuất điều gì? Để ghi đè 'Model.get_or_insert()' và để nâng cao một ngoại lệ bên trong giao dịch nếu nhận được một phần trả về người dùng? – Maxim

+1

Tôi khuyên bạn nên triển khai giao dịch thực hiện chính xác những gì cần - cố gắng lấy mô hình; ném một lỗi nếu nó tồn tại, và tạo ra nó nếu nó không. –

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