|
|
1
15
如前所述,如果你想保持简单,只需使用一个eg
记录原始订单 类不跟踪属性的顺序。但是,您可以跟踪字段实例的创建顺序。为此,您必须为字段使用自己的类(而不是int)。该类跟踪已经生成了多少个实例,并且每个实例都记下其位置。下面是您在示例(存储整数)中的操作方法:
创建一个
既然您的字段有一个可以用来排序的数字,那么您的父类就需要以某种方式使用它。如果我没记错的话,你可以用多种方法来实现,Django使用元类来实现这一点,这对于一个简单的类来说有点疯狂。
使用这个元类
那么,你怎么用这个?首先,你需要使用我们的新
然后您可以访问我们自动创建的属性中的有序字段。
请随意将此更改为有序的dict,或者只返回名称或您需要的任何内容。此外,还可以使用
不要用这个! 如您所见,这种方法有点过于复杂,可能不适合大多数任务或Python开发人员。如果您对Python比较陌生,那么开发元类所花费的时间和精力可能会比手工定义排序所花费的时间和精力要多。手工定义自己的订单几乎总是最好的方法。Django会自动执行,因为复杂的代码对最终开发人员来说是隐藏的,而且Django的使用频率远高于它本身的编写/维护频率。因此,只有当您为其他开发人员开发框架时,元类才可能对您有用。 |
|
|
2
5
我80%的人在威尔发布他的答案时就已经完成了,但我还是决定发布,这样就不会浪费精力(我们的答案基本上描述了相同的事情)。 这是Django的做法。我选择了和Django保持相同的命名法、方法和数据结构,这样这个答案对试图理解字段名在Django中是如何排序的人来说也很有用。
现在让我们定义一些示例模型:
让我们来测试一下:
希望这有助于澄清在威尔的回答中还不清楚的事情。 |
|
|
3
3
|
|
|
4
1
Django的模型和表单元类与字段描述符一起维护原始顺序。如果不跳过一个 许多 箍。如果您仍然感兴趣,请参阅django源代码。 |
|
|
5
1
您不能跟踪类变量的添加顺序。这些属性(以及对象上的属性)在内部存储为字典,字典针对快速查找进行了优化,不支持排序。 你可以看到这个事实:
如果希望属性按特定顺序排列,可以添加另一个包含以下信息的字段:
旁注:在Python2.7和3.2中,有序字典将作为标准库的一部分引入。 |
|
|
6
1
现在只需使用python 3.6!
这将输出我:
|