Catatan: Developer yang membuat aplikasi baru sangat dianjurkan untuk menggunakan Library Klien NDB, yang memiliki beberapa manfaat dibandingkan dengan library klien ini, seperti caching entity otomatis melalui Memcache API. Jika saat ini Anda menggunakan Library Klien DB yang lebih lama, baca Panduan Migrasi DB ke NDB
Class PolyModel adalah superclass untuk definisi model data yang dapat menjadi superclass untuk definisi model data lainnya. Kueri yang dihasilkan dari class PolyModel dapat memiliki hasil yang merupakan instance class atau subclass-nya.
PolyModel
disediakan oleh modul google.appengine.ext.db.polymodel
.
PolyModel adalah subclass Model, dan mewarisi class serta metode instance-nya dari class tersebut. Class PolyModel menggantikan beberapa metode Model, tetapi tidak memperkenalkan elemen antarmuka baru.
Pengantar
Menentukan model data sebagai hierarki klasifikasi sering kali berguna, seperti bagaimana database objek dapat menentukan satu class objek sebagai sub-class lainnya. Database tersebut dapat menjalankan kueri pada objek dari class induk, dan menyertakan objek dari sub-class dalam hasilnya. App Engine Datastore tidak mendukung jenis kueri ini secara native, tetapi Anda dapat menerapkannya menggunakan mekanisme yang disertakan dengan Python SDK, class PolyModel
.
Class model yang berasal dari PolyModel
dapat menjadi class dasar untuk class model lainnya. Kueri yang dibuat untuk class ini dengan menggunakan metode all()
dan gql()
tahu untuk menyertakan instance subclass dalam hasil.
Subclass dapat menentukan properti baru yang tidak ada di class induk. Namun, subclass tidak dapat mengganti definisi properti dari class induk. (Melakukan hal tersebut akan menghasilkan error DuplicateProperty
.)
Sebagai referensi, berikut adalah contoh sederhana dari Entity dan Model. Perhatikan bahwa PolyModel
class disediakan oleh paket google.appengine.ext.db.polymodel
.
from google.appengine.ext import db from google.appengine.ext.db import polymodel class Contact(polymodel.PolyModel): phone_number = db.PhoneNumberProperty() address = db.PostalAddressProperty() class Person(Contact): first_name = db.StringProperty() last_name = db.StringProperty() mobile_number = db.PhoneNumberProperty() class Company(Contact): name = db.StringProperty() fax_number = db.PhoneNumberProperty() p = Person(phone_number='1-206-555-9234', address='123 First Ave., Seattle, WA, 98101', first_name='Alfred', last_name='Smith', mobile_number='1-206-555-0117') p.put() c = Company(phone_number='1-503-555-9123', address='P.O. Box 98765, Salem, OR, 97301', name='Data Solutions, LLC', fax_number='1-503-555-6622') c.put() for contact in Contact.all(): # Returns both p and c. # ... for person in Person.all(): # Returns only p. # ...
Polimorfisme bukan fitur native dari datastore. Sebagai gantinya, polimorfisme diterapkan dalam class PolyModel
itu sendiri. Semua entity yang dibuat dari subclass PolyModel
disimpan di datastore dengan jenis yang sama, yang merupakan nama class root (misalnya Animal
). Setiap objek menyimpan hierarki class-nya sebagai properti multi-nilai dari entity bernama 'class'
. Saat aplikasi membuat kueri menggunakan metode all()
atau gql()
class PolyModel
, kueri tersebut akan menyertakan filter pada properti 'class'
yang membatasi hasil ke entity yang dibuat dari class tersebut atau subclass apa pun.
Karena PolyModel
menggunakan properti entity untuk menyimpan informasi class, indeks untuk kueri polimorfik harus mengakomodasi properti 'class'
. Filter tersirat adalah filter kesetaraan, dan dapat digabungkan dengan filter kesetaraan dan filter ketidaksetaraan lainnya di properti lain.
Catatan: PolyModel hanya menggunakan nama class di properti 'class'
, bukan jalur lengkap. Anda dapat membuat hierarki class dengan beberapa node dengan nama yang sama, seperti A
→ B
dan A
→ C
→ B
. Kueri untuk salah satu akan menampilkan entity keduanya. Demikian pula, kueri untuk A
→ B
→ C
dan A
→ C
→ B
identik secara fungsional. Sebaiknya hindari membuat hierarki class tunggal dengan beberapa node dengan nama yang sama.
PolyModel
tidak mendukung penggantian definisi model properti di subclass. Jika subclass mencoba menentukan ulang properti yang ditentukan pada superclass, definisi class akan memunculkan DuplicatePropertyError
.
PolyModel
mendukung beberapa pewarisan, termasuk pewarisan dari beberapa class yang memiliki sebuah superclass (pewarisan "berlian"). Sebuah class tidak dapat mewarisi dari dua class yang masing-masing menentukan definisi model properti untuk properti yang sama (ini akan memunculkan DuplicatePropertyError
). Namun, sebuah class dapat mewarisi dari dua class yang mewarisi definisi model properti yang sama dari superclass yang sama.
PolyModel
tidak mendukung properti dinamis, seperti Expando. Tidak ada yang setara dengan PolyModel
untuk Expando
.
Konstruktor
Konstruktor class PolyModel ditentukan sebagai berikut:
- class PolyModel(parent=None, key_name=None, **kwds)
-
Class model yang dapat menjadi superclass untuk class model lainnya, dan yang kuerinya dapat menyertakan instance subclass sebagai hasil. Seperti Model, class PolyModel harus dibuatkan subclass-nya untuk menentukan jenis entity data.
PolyModel adalah subclass Model, dan mewarisi atau mengganti metodenya.
Argumen
- parent
- Instance Model atau instance Key untuk entity yang merupakan induk entity baru.
- key_name
-
Nama untuk entity baru. Nama akan menjadi bagian dari kunci utama. Jika
None
, ID yang dibuat sistem akan digunakan untuk kunci tersebut.Nilai untuk key_name tidak boleh diawali dengan angka, dan tidak boleh berupa
__*__
. Jika aplikasi Anda menggunakan data yang dikirim pengguna sebagai nama kunci entity datastore (seperti alamat email), aplikasi harus membersihkan nilai tersebut terlebih dahulu, seperti dengan mengawalinya dengan string yang dikenal seperti "key:", untuk memenuhi persyaratan ini.key_name
disimpan sebagai string Unicode, dengan nilaistr
yang dikonversi sebagai teks ASCII. - **kwds
- Nilai awal untuk properti instance, sebagai argumen kata kunci. Setiap nama terkait dengan atribut instance baru, dan harus sesuai dengan properti tetap yang ditentukan di class PolyModel.
Metode Class
Selain metode class yang ditentukan oleh class Model, class PolyModel menyediakan metode class berikut:
- PolyModel.class_key()
-
Menampilkan nama class dan nama semua class induk untuk class tersebut, sebagai tuple.
- PolyModel.class_name()
-
Menampilkan nama class. Class dapat mengganti metode ini jika nama class Python berubah, tetapi entity harus terus menggunakan nama class asli.