django orm union 合并查询集合 顺序错乱

180 阅读1分钟

错误示例

qs1 = Work.objects.annotate(
    name=F('work_name'), age1=Value(
99, output_field=IntegerField())
    ).values('id', 'name', 'todo', 'age1')
qs2 = User.objects.annotate(
    age1=F('age'), name=F('username'), todo=F('', output_field=CharField(max_length=1))
    ).values('id', 'name', 'todo', 'age1')
    
qs = qs1.union(qs2)

会导致顺序错乱

正确

qs1 = Work.objects.annotate(
    name=F('work_name'), todo1=F('todo'),age1=Value(
99, output_field=IntegerField())
    ).values('id', 'name', 'todo1', 'age1')
qs2 = User.objects.annotate(
    name=F('username'), todo1=F('', output_field=CharField(max_length=1)), age1=F('age')
    ).values('id', 'name', 'todo1', 'age1')
    
qs = qs1.union(qs2)

方法一:需要在annotate中固定顺序

方法二:使用多个有顺序的annotate

总结

union字段顺序和类型一定需要相同,名称可以不同会一第一个为准

参考