How can I access the ordered list of model fields? Because model_instance._meta.fields
returns fields without m2m, but in admin view the fields order exactly same as they are defined in class.
(like edit form on admin site) ?
Try
sorted(model_instance._meta.fields + model_instance._meta.many_to_many,
key=lambda x:x.creation_counter)
If M2M fields are defined after normal fields, you could use fields + many_to_many
directly since both of them are already in the declaration ordering.
update
If you prefer to use operator.attrgetter()
instead of lambda
, it's OK, the performance difference is trivial. But attrgetter
is not guranteed to be faster:
In[1]: from django.contrib.auth.models import User
In[2]: fields = User._meta.fields + User._meta.many_to_many
In[3]: %timeit sorted(fields, key=lambda x:x.creation_counter)
100000 loops, best of 3: 6.47 us per loop
In[4]: from operator import attrgetter
In[5]: %timeit sorted(fields, key=attrgetter('creation_counter'))
100000 loops, best of 3: 9.17 us per loop
In[6]: ag=attrgetter('creation_counter')
In[7]: %timeit sorted(fields, key=ag)
100000 loops, best of 3: 8.68 us per loop
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With