#12096: Model fields are not accessible as attributes of the model class
-------------------------------------+-------------------------------------
     Reporter:  sejo                 |                    Owner:
         Type:  New feature          |                   Status:  new
    Component:  Database layer       |                  Version:  1.1
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:  model, docstrings,   |             Triage Stage:  Accepted
  attributes                         |
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by sephii):

 To get this to work we need to change some low-level stuff since model
 fields are stripped out by the metaclass to be put in Model._meta. Since
 [http://www.sphinx-doc.org/en/stable/ext/autodoc.html Sphinx's autodoc
 module allows to manually add members to a class] I think it would be
 better to do in manually than trying to change the way Django models are
 constructed.

 Anyway, I came up with the following code that makes Sphinx's autodoc work
 for Django models. It is '''very''' hackish and unsurprisingly makes some
 tests fail, so I'm just putting this here for the record in case anyone
 would want to take that over someday.

 {{{
 #!python
 class ModelBase(type):
     def __getattr__(self, attr):
         if attr == '_meta':
             raise AttributeError(attr)

         try:
             return self._meta.get_field(attr)
         except FieldDoesNotExist:
             raise AttributeError(attr)

     @property
     def __dict__(self):
         try:
             model_dict = {
                 f.name: f for f in self._meta.get_fields()
             }
         except AppRegistryNotReady:
             model_dict = {}

         model_dict.update(super(ModelBase, self).__dict__)
         return model_dict

     # Rest of ModelBase code...
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/12096#comment:10>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/062.97e27ed481f1f7f1b2f2d8747306bd0b%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to