Python / Django是否保证外键中的对象保持相同的顺序?

时间:2017-02-14 13:40:17

标签: python django

假设我有以下型号:

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?或者它只保证四个对象将以任何顺序循环?

注意:我确实尝试了它们,它们是按实例化顺序排列的,但是,我想确保这种行为得到保证,因为排序很重要。

3 个答案:

答案 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