2017-02-14 46 views
0

假设我有以下型号: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的四个对象,ST2ST3ST4和他们的情况属性设置为案例实例C。现在的问题是,当我做这个循环:

for subtask in SubTask.objects.filter(case=C): 
    #Do something to subtasks 

是否保证通过Python或Django的是,在这个循环中的对象会出现的顺序ST1,ST2,ST3,然后ST4?或者它只保证四个对象以任何顺序循环播放?

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

回答

3

Django不强制执行任何命令,除了您自己提供的任何命令。如果您的SubTask模型在其Meta类中有ordering属性,那么子任务将始终以这种方式排序;或者,您可以在过滤时明确提供order_by子句。

否则,Django只是按照数据库提供的顺序提供这些项目。请注意,尽管dbs可能会按您想要的顺序返回事物,但严格地说,如果没有明确说明,SQL中的order是未定义的。

+0

是否有任何内置的方式使用ORDER_BY使这个排序(???),或者我需要添加一个“created_at”属性添加到模型,并将其设置为时区.now()当对象被创建时? – AspiringMat

+0

确保插入顺序的唯一方法是添加时间戳字段,是的。请注意,如果在定义中使用'auto_now_add = True',则Django将自动设置创建日期。 –

+0

太棒了!谢谢您的帮助 :-) – AspiringMat

0

只需遍历主键以确保对象按照添加到数据库的顺序迭代。

for subtask in SubTask.objects.filter(case=C).order_by('pk'): 
    #Do something to subtasks 
相关问题