Class PolyModel

Catatan: Developer yang membuat aplikasi baru sangat dianjurkan untuk menggunakan Library Klien NDB, yang memiliki beberapa manfaat dibandingkan dengan library klien ini, seperti menyimpan entity dalam cache secara 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 PolyModelclass 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 AB dan ACB. Kueri untuk salah satu akan menampilkan entity keduanya. Demikian pula, kueri untuk ABC dan ACB 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 nilai str 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.