Django按顺序获取模型字段

Moj*_*imi 5 django django-models

有没有办法按代码顺序获取它们,或者为 Django 模型的字段设置顺序?当我调用MyModel._meta.get_fields()它们时,它们是无序的(尽管看起来是相同的“无序”顺序,只要您不重置服务器就好了)。

如果可能,无需更改覆盖任何方法的基础库

我已经阅读了关于表单https://docs.djangoproject.com/en/1.9/ref/forms/api/#django.forms.Form.order_fields 中的订购,但不是在模型本身中

元属性“ordering”仅在进行查询时定义对象的默认顺序

小智 5

实际上get_fields()固定顺序返回字段。

看看 django示例

>>> from django.contrib.auth.models import User
>>> User._meta.get_fields()
(<ManyToOneRel: admin.logentry>,
 <django.db.models.fields.AutoField: id>,
 <django.db.models.fields.CharField: password>,
 <django.db.models.fields.DateTimeField: last_login>,
 <django.db.models.fields.BooleanField: is_superuser>,
 <django.db.models.fields.CharField: username>,
 <django.db.models.fields.CharField: first_name>,
 <django.db.models.fields.CharField: last_name>,
 <django.db.models.fields.EmailField: email>,
 <django.db.models.fields.BooleanField: is_staff>,
 <django.db.models.fields.BooleanField: is_active>,
 <django.db.models.fields.DateTimeField: date_joined>,
 <django.db.models.fields.related.ManyToManyField: groups>,
 <django.db.models.fields.related.ManyToManyField: user_permissions>)
Run Code Online (Sandbox Code Playgroud)

我重复了这段代码并得到了相同的结果。如果你再深入研究一下源码,你会发现顺序是这样的:

  1. parent以递归方式获取每个字段。
  2. 远程字段。
  3. 本地字段。
  4. 本地多对多字段。
  5. 私有字段。

所有这一切都表明,如果您在模型中的某个其他普通字段之前定义某个普通字段,那么您将始终以相同的顺序在get_fields()结果中获得它。

但是要小心依赖未记录的行为,因此将来可能会在没有任何警告的情况下对其进行更改。