django - queryset.last()没有返回正确的顺序/最后一条记录

时间:2017-03-21 05:55:57

标签: django

编写生成JSON的代码。 JSON的最后一部分必须由",#34;终止,所以在我的代码中:

- 定义查询集以检索数据库字段的不同值:

databases_in_workload = DatabaseObjectsWorkload.objects.filter(workload=migration.workload_id).values_list('database_object__database', flat=True).distinct()

- 然后我在它上面循环:

    for database_wk in databases_in_workload:
        ... do something
        if not (database_wk == databases_in_workload.last()):

                job_json_string = job_json_string + '} ],'
        else:
            job_json_string = job_json_string + '} ]'

我希望最后一条记录以方括号结尾,前面用逗号表示。但相反,相反的情况正在发生。

我还查看了数据库表的内容。我拥有的数据" database_wk"是user02(对于具有较低主键值的记录)和user01(对于DB中具有较高pk值的记录)。订单(如果user01是第一个或最后一个)确实无关紧要,只要最后一条记录被last()正确识别 - 所以如果我在查询集迭代中有user02,user01,我希望last()返回user01。但是 - 这不能正常工作。 奇怪的是,如果在数据库(Postgres)中更改了订单(首先是user01,然后是按主键值排序的user02)那么" if"上面的代码工作,但在我的情况下last()似乎返回第一个记录,而不是最后一个。它好像数据库中有一个订单,查询集中有另一个订单,而last()正在接受数据库订单......任何人之前遇到/解决了这个问题?或者 - 用于识别查询集中最后一条记录的任何其他方法(除了last())我可以尝试也会有所帮助。提前谢谢了!

1 个答案:

答案 0 :(得分:1)

原因是它的行为方式是因为没有指定排序。尝试使用order_byREF

来自:queryset.first()

  

如果QuerySet没有定义排序,那么查询集将由主键

自动排序

来自:queryset.last()

  

与first()类似,但返回查询集中的最后一个对象。

如果您不想使用order_by,请尝试使用queryset.latest()