Estou usando o Django, que permite que as pessoas adicionem parâmetros extras a uma classe usando class Meta
.
class FooModel(models.Model):
...
class Meta:
...
A única coisa que encontrei na documentação do Python foi:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
No entanto, acho que não é a mesma coisa.
Respostas:
Você está fazendo uma pergunta sobre duas coisas diferentes:
Meta
classe interna nos modelos Django :Este é apenas um contêiner de classe com algumas opções (metadados) anexadas ao modelo. Ele define itens como permissões disponíveis, nome da tabela de banco de dados associado, se o modelo é abstrato ou não, versões singular e plural do nome etc.
Aqui está uma breve explicação: Django docs: Models: Meta options
A lista de meta opções disponíveis está aqui: Django docs: Model Meta options
Para a versão mais recente do Django: Django docs: opções do Model Meta
Metaclasse em Python :
A melhor descrição está aqui: O que são metaclasses no Python?
fonte
Meta
classe interna do Django impede que você use os recursos de metaclasse incorporados do Python?Estendendo a resposta Django de Tadeck acima, o uso de 'class Meta:' no Django também é apenas Python normal.
A classe interna é um espaço de nomes conveniente para dados compartilhados entre as instâncias da classe (daí o nome Meta para 'metadados', mas você pode chamá-lo como quiser). Enquanto no Django geralmente é um material de configuração somente leitura, não há nada para impedir que você mude:
Você também pode explorá-lo diretamente no Django, por exemplo:
No entanto, no Django é mais provável que você queira explorar o
_meta
atributo que é umOptions
objeto criado pelo modelometaclass
quando ele é criado. É aqui que você encontrará todas as informações 'meta' da classe Django. No Django,Meta
é usado apenas para passar informações ao processo de criação do_meta
Options
objeto.fonte
MyUser.objects.get(pk=1)._meta
type(MyUser.objects.get(pk=1)).Meta
A
Model
classe do Django lida especificamente com um atributo chamadoMeta
qual é uma classe. Não é uma coisa geral do Python.As metaclasses do Python são completamente diferentes.
fonte
Meta
classe funciona? Eu acredito que o OP perguntou especificamente sobre isso.Respostas que reivindicam o modelo do Django
Meta
e metaclasses do são "completamente diferentes" são respostas enganosas.A construção dos objetos de classe do modelo Django (ou seja, o objeto que representa a própria definição de classe; sim, classes também são objetos) são realmente controlados por uma metaclasse chamada
ModelBase
, você pode ver esse código aqui:https://github.com/django/django/blob/master/django/db/models/base.py#L61
E uma das coisas que
ModelBase
faz é criar o_meta
atributo em todos os modelos do Django que contenham mecanismos de validação, detalhes de campo, salvar lógica e assim por diante. Durante esta operação, o material especificado nas partes internas do modeloMeta
classe são lidas e usadas nesse processo.Então, enquanto sim, em certo sentido,
Meta
e as metaclasses são 'coisas' diferentes, dentro da mecânica da construção do modelo do Django elas estão intimamente relacionadas; a compreensão de como eles funcionam juntos aprofundará sua percepção dos dois ao mesmo tempo.Esta pode ser uma fonte útil de informações para entender melhor como os modelos do Django empregam metaclasses.
https://code.djangoproject.com/wiki/DevModelCreation
E isso também pode ajudar se você quiser entender melhor como os objetos funcionam em geral.
https://docs.python.org/3/reference/datamodel.html
fonte
Documento da classe Meta interna Este documento dos metadados do django Model é "qualquer coisa que não seja um campo", como opções de pedido (pedido), nome da tabela do banco de dados (db_table) ou nomes singulares e plurais legíveis por humanos (verbose_name e verbose_name_plural). Nenhuma é necessária e a adição de classe Meta a um modelo é completamente opcional. https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options
fonte
No Django, ele atua como uma classe de configuração e mantém os dados de configuração em um só lugar !!
fonte