Saya menggunakan Django yang memungkinkan orang untuk menambahkan parameter tambahan ke kelas dengan menggunakan class Meta
.
class FooModel(models.Model):
...
class Meta:
...
Satu-satunya yang saya temukan dalam dokumentasi Python adalah:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
Namun, saya tidak berpikir ini adalah hal yang sama.
Jawaban:
Anda mengajukan pertanyaan tentang dua hal berbeda:
Meta
kelas batin dalam model Django :Ini hanya wadah kelas dengan beberapa opsi (metadata) yang melekat pada model. Ini mendefinisikan hal-hal seperti izin yang tersedia, nama tabel database terkait, apakah model itu abstrak atau tidak, versi tunggal dan jamak nama dll.
Penjelasan singkat ada di sini: Django docs: Models: Meta options
Daftar opsi meta yang tersedia ada di sini: Django docs: Opsi Model Meta
Untuk versi terbaru Django: Django docs: Opsi Model Meta
Metaclass dalam Python :
Deskripsi terbaik ada di sini: Apa itu metaclasses dalam Python?
sumber
Meta
kelas dalam Django mencegah Anda menggunakan fitur metaclass builtin Python?Memperluas jawaban Tangeck's Django di atas, penggunaan 'class Meta:' di Django juga hanya Python biasa.
Kelas internal adalah namespace yang nyaman untuk data bersama di antara instance kelas (maka nama Meta untuk 'metadata' tetapi Anda dapat menyebutnya apa saja yang Anda suka). Sementara di Django umumnya hanya konfigurasi hal-hal yang hanya baca, tidak ada yang menghentikan Anda mengubahnya:
Anda juga dapat menjelajahinya di Django misalnya:
Namun, di Django Anda lebih cenderung ingin menjelajahi
_meta
atribut yang merupakanOptions
objek yang dibuat oleh modelmetaclass
ketika sebuah model dibuat. Di situlah Anda akan menemukan semua informasi 'meta' kelas Django. Dalam Django,Meta
hanya digunakan untuk meneruskan informasi ke dalam proses membuat_meta
Options
objek.sumber
MyUser.objects.get(pk=1)._meta
type(MyUser.objects.get(pk=1)).Meta
Model
Kelas Django secara khusus menangani memiliki atribut bernamaMeta
yang merupakan kelas. Ini bukan hal Python umum.Metaclasses Python sangat berbeda.
sumber
Meta
kerja kelas? Saya percaya OP bertanya secara spesifik tentang itu.Jawaban yang mengklaim model Django
Meta
dan metaclasses "sangat berbeda" adalah jawaban yang menyesatkan.Konstruksi objek kelas model Django (artinya objek yang mewakili definisi kelas itu sendiri; ya, kelas juga objek) memang dikendalikan oleh metaclass yang disebut
ModelBase
, Anda dapat melihat kode itu di sini:https://github.com/django/django/blob/master/django/db/models/base.py#L61
Dan salah satu hal yang
ModelBase
dilakukan adalah membuat_meta
atribut pada setiap model Django yang berisi mesin validasi, detail lapangan, save logic, dan sebagainya. Selama operasi ini, hal-hal yang ditentukan di bagian dalam modelMeta
kelas dibaca dan digunakan dalam proses itu.Jadi, sementara ya, dalam arti
Meta
dan metaclasses adalah 'hal' yang berbeda, dalam mekanisme konstruksi model Django mereka terkait erat; memahami bagaimana mereka bekerja bersama akan memperdalam wawasan Anda menjadi keduanya sekaligus.Ini mungkin menjadi sumber informasi yang bermanfaat untuk lebih memahami bagaimana model Django menggunakan metaclasses.
https://code.djangoproject.com/wiki/DevModelCreation
Dan ini mungkin membantu juga jika Anda ingin lebih memahami bagaimana benda bekerja secara umum.
https://docs.python.org/3/reference/datamodel.html
sumber
Dokumen Kelas Meta Dalam Dokumen metadata Model django ini adalah "apa pun yang bukan bidang", seperti opsi pemesanan (pemesanan), nama tabel database (db_table), atau nama tunggal dan jamak yang dapat dibaca manusia (verbose_name dan verbose_name_plural). Tidak ada yang diperlukan, dan menambahkan kelas Meta ke model sepenuhnya opsional. https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options
sumber
Di Django, ini bertindak sebagai kelas konfigurasi dan menyimpan data konfigurasi di satu tempat !!
sumber