假设我有以下型号:
class Case:
case_name = models.CharField(max_length=200)
class SubTask:
subtask_name = models.CharField(max_length=200)
case = models.ForeignKey(Case, on_delete = models.CASCADE)
假设我创建了四个SubTask st1 , st2 , st3 和 st4 的对象此订单并将其案例属性设置为案例实例 C 。现在我的问题是,当我这样做时:
for subtask in SubTask.objects.filter(case=C):
#Do something to subtasks
python或Django 保证这个循环中的对象将按顺序出现在st1,st2,st3,然后是st4?或者它只保证四个对象将以任何顺序循环?
注意:我确实尝试了它们,它们是按实例化顺序排列的,但是,我想确保这种行为得到保证,因为排序很重要。
答案 0 :(得分:4)
除了你自己提供的任何订单外,Django不会强加任何订单。如果您的SubTask模型在其Meta类中具有ordering
属性,则子任务将始终以这种方式排序;或者,您可以在过滤时明确提供order_by
子句。
否则,Django只按数据库提供的顺序提供项目。请注意,虽然dbs可能会按照您想要的顺序返回内容,但严格来说,如果没有明确说明,SQL中的顺序是不确定的。
答案 1 :(得分:0)
只需遍历主键,确保对象的迭代顺序与添加到数据库的顺序相同。
for subtask in SubTask.objects.filter(case=C).order_by('pk'):
#Do something to subtasks
答案 2 :(得分:0)
您可以在ordering
Case
课程中设置Meta
选项。请参阅此处的文档:
https://docs.djangoproject.com/en/1.10/ref/models/options/#ordering