Eu defini uma User
classe que (em última análise) herda models.Model
. Quero obter uma lista de todos os campos definidos para este modelo. Por exemplo phone_number = CharField(max_length=20)
,. Basicamente, quero recuperar qualquer coisa que herda da Field
classe.
Eu pensei que seria capaz de recuperá-los aproveitando inspect.getmembers(model)
, mas a lista que ele retorna não contém nenhum desses campos. Parece que o Django já conseguiu a classe e adicionou todos os seus atributos mágicos e retirou o que realmente foi definido. Então ... como posso obter esses campos? Eles provavelmente têm uma função para recuperá-los para seus próprios fins internos?
django
django-models
mpen
fonte
fonte
Respostas:
Como a maioria das respostas está desatualizada, tentarei atualizá-lo no Django 2.2. Aqui postagens - seu aplicativo (postagens, blog, loja, etc.)
1) No link do modelo : https://docs.djangoproject.com/en/2.2/ref/models/meta/
Observe que:
Também terá alguns relacionamentos, que por ex. você não pode exibir em uma exibição.
Como no meu caso:
e
2) Da instância
3) Do modelo pai
Vamos supor que temos Post como modelo pai e você deseja ver todos os campos em uma lista e que os campos pai sejam somente leitura no modo de edição.
fonte
clean_field_names = [str(h).split('.')[2].replace("_", " ").title() for h in all_fields]
all_fields = bp._meta.fields
Django versões 1.8 e posteriores:
Você deve usar
get_fields()
:O
get_all_field_names()
método foi descontinuado a partir do Django 1.8 e será removido na 1.10 .A página de documentação vinculada acima fornece uma implementação totalmente compatível com versões anteriores
get_all_field_names()
, mas, na maioria dos casos, o exemplo anterior deve funcionar bem.Versões do Django anteriores à 1.8:
Isso deve fazer o truque.
Isso requer uma instância de modelo real. Se tudo o que você tem é uma subclasse de
django.db.models.Model
, então você deve chamarmyproject.myapp.models.MyModel._meta.get_all_field_names()
fonte
model._meta.fields
entanto, e seus nomes são recuperáveis com ofield.name
que parece. Eu só espero que esta é a maneira mais estável para recuperar esta informação :)django.db.models.Model
. Eu vou cavar-lo e ver o que posso encontrar_meta
atributo é a única maneira ... Além disso, procure_meta.many_to_many
por campos ManyToMany!O
get_all_related_fields()
método mencionado aqui foi preterido em 1.8 . De agora em diante éget_fields()
.fonte
Acho que adicionar isso aos modelos de django é bastante útil:
Isso permite que você faça:
fonte
django.db.models.fields.related.RelatedObjectDoesNotExist: CustomModel has no custom_attribute.
ForeignKey
funciona bem para mim. Embora, capturar silenciosamente todas as exceções seja um antipadrão. Muito melhor pegarAttributeError
, ou pelo menos registrar que alguma exceção foi silenciosamente engolida.self._meta.get_all_field_names()
foi depreciado e removido. Você pode usar algo comofor field in self._meta.get_fields()
e depoisyield (field.name, field.value_from_object(self))
Isso faz o truque. Eu só testei no Django 1.7.
Model._meta.local_fields
não contém campos muitos para muitos. Você deveria usá-losModel._meta.local_many_to_many
.fonte
Não está claro se você tem uma instância da classe ou da própria classe e está tentando recuperar os campos, mas, de qualquer forma, considere o código a seguir
Usando uma Instância
Usando uma classe
fonte
Isso funcionou para mim em
django==1.11.8
fonte
MyModel._meta.get_all_field_names()
foi preterido várias versões de volta e removida no Django 1.10.Aqui está a sugestão compatível com versões anteriores dos documentos :
fonte
Só para adicionar, eu estou usando auto-objeto, isso funcionou para mim:
fonte
Pelo menos com o Django 1.9.9 - a versão que estou usando atualmente -, observe que,
.get_fields()
na verdade, também "considera" qualquer modelo estrangeiro como um campo, o que pode ser problemático. Digamos que você tenha:Segue que
enquanto, como mostrado por @Rockallite
fonte
Portanto, antes de encontrar este post, achei que funcionava com êxito.
Funciona igualmente como
Não tenho certeza de qual é a diferença nos resultados, se houver. Eu executei esse loop e obtive a mesma saída.
fonte
Por que não usar isso:
Exemplo de saída:
fonte