Given a Django model, I’m trying to list all of its fields. I’ve seen some examples of doing this using the _meta model attribute, but doesn’t the underscore in front of meta indicate that the _meta attribute is a private attribute and shouldn’t be accessed directly? … Because, for example, the layout of _meta could change in the future and not be a stable API?
Is _meta an exception to this rule? Is it stable and ready to use or is it considered bad practice to access it? Or is there a function or some other way to introspect the fields of a model without using the _meta attribute? Below is a list of some links showing how to do this using the _meta attribute
Any advice is much appreciated.
_metais private, but it’s relatively stable. There are efforts to formalise it, document it and remove the underscore, which might happen before 1.3 or 1.4. I imagine effort will be made to ensure things are backwards compatible, because lots of people have been using it anyway.If you’re particularly concerned about compatibility, write a function that takes a model and returns the fields. This means if something does change in the future, you only have to change one function.
I believe this will return a list of
Fieldobjects. To get the value of each field from the instance, usegetattr(instance, field.name).Update: Django contributors are working on an API to replace the _Meta object as part of a Google Summer of Code. See:
– https://groups.google.com/forum/#!topic/django-developers/hD4roZq0wyk
– https://code.djangoproject.com/wiki/new_meta_api