如何在django中同时在多个表中进行此类查询

时间:2012-09-26 15:31:05

标签: django

我发生了如下所示的一些查询:

bphoto = B_Photo.objects.filter(q_user).order_by('-pub_date')
bactivity = B_Activity.objects.filter(q_user).order_by('-pub_date')
bpart = B_Part.objects.filter(q_user).order_by('-pub_date')

q_user是一个Q对象,我想要的是对三个表中的所有结果进行排序,使用'pub_date'字段。

我该如何简化这种查询?

1 个答案:

答案 0 :(得分:0)

B_PhotoB_ActivityB_Part没有相同的表格结构,对吧?我认为你不能用三个不同的表进行查询。 UNION可以这样做,但它要求所有子查询返回具有相同结构的数据。

您似乎想要显示与照片,活动和零件混合的时间轴。最合理的方法是在python中对结果进行排序。

bphoto = B_Photo.objects.filter(q_user).order_by('-pub_date')
bactivity = B_Activity.objects.filter(q_user).order_by('-pub_date')
bpart = B_Part.objects.filter(q_user).order_by('-pub_date')

timeline = sorted(bphoto + bactivity + bpart, key=lambda x:x.pub_date)

更新:

我明白你的意思了。如果你在这3个表中有太多数据并且你只想显示最近的20个记录,你可以在3个表上运行原始的UNION sql,如下所示:

cursor = connection.cursor()
cursor.execute("SELECT id, type FROM (
    SELECT id, 'photo' AS type, pub_date FROM b_photo UNION 
    SELECT id, 'activity' AS type, pub_date FROM b_activity UNION 
    SELECT id, 'part' AS type, pub_date FROM b_part) 
    ORDER BY pub_date DESC LIMIT 20")
results = cursor.fetchall()
# results will be something like ((id, type), (id, type), ...)
# where type indicates what the id is (photo, activity or part)

然后使用个人B_XXX.objects.get(id=id)获取ids中的每个对象。

for result in results:
    if result[1] == 'photo':
        obj = B_Photo.objects.get(id=result[0])
    elif result[1] == 'activity':
        obj = B_Activity.objects.get(id=result[0])
    elif result[1] == 'part':
        obj = B_Part.objects.get(id=result[0])
    # do sth with obj...