如何在一个表中显示两个QuerySet?

时间:2010-05-30 19:55:03

标签: django

我有两个不同的QuerySet,它们都返回一个Users列表(包含不同的字段)。如何在一个HTML表格中显示它们?返回用户之间会有一些重叠,对于丢失的数据,我只想用0填充它(我可以在带有default过滤器的模板中进行填充)。

如果有帮助,查询将如下所示:

new_users = User.objects.filter(date_joined__gt=sd, date_joined__lte=ed)
new_referrals = User.objects.filter(referrals__user__in=new_users).annotate(referral_count=Count('referrals')).select_related('profile')

accepted_bids = Bid.objects.filter(created__gt=sd, created__lte=ed, status='acc')
completed_shipments = Shipment.objects.filter(bids__in=accepted_bids)
vehicles_shipped = User.objects.filter(referrals__user__shipments__in=completed_shipments).annotate(vehicles_shipped=Count('referrals__user__shipments__items')).select_related('profile')

我需要合并new_referralsvehicles_shipped,以便我可以在我的模板中迭代它(合并在user.id之类的东西上),或类似的东西...也许我可以某种程度上使用python的itertools


以下是vehicles_shipped查询生成的SQL:

SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined", COUNT("shipments_vehicleitem"."id") AS "vehicles_shipped", T7."id", T7."user_id", T7."company_name", T7."phone", T7."address_id", T7."referred_by_id", T7."user_type_id", T7."object_id", T7."credits" FROM "auth_user" LEFT OUTER JOIN "users_profile" ON  ("auth_user"."id" = "users_profile"."referred_by_id") LEFT OUTER JOIN "auth_user" T3 ON ("users_profile"."user_id" = T3."id") LEFT OUTER JOIN "shipments_shipment" ON (T3."id" = "shipments_shipment"."user_id") INNER JOIN "shipments_bid" ON ("shipments_shipment"."id" = "shipments_bid"."shipment_id") LEFT OUTER JOIN "shipments_vehicleitem" ON ("shipments_shipment"."id" = "shipments_vehicleitem"."shipment_id") LEFT OUTER JOIN  "users_profile" T7 ON ("auth_user"."id" = T7."user_id") WHERE ("shipments_bid"."created" <= E'2010-05-27 18:22:41.954766' AND "shipments_bid"."status" = E'acc' AND "shipments_bid"."created" > E'0001-01-01 00:00:00' ) GROUP  BY "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined", T7."id", T7."user_id", T7."company_name", T7."phone", T7."address_id", T7."referred_by_id", T7."user_type_id", T7."object_id", T7."credits"

5 个答案:

答案 0 :(得分:1)

对于大多数应用程序,除了默认的django queryset组合之外,您真的不需要任何其他内容。这将合并到主键上。

combined = new_referrals | vehicles_shipped

我真的很惊讶这在django文档中找不到,这种行为已经很老了。你应该拿出一张票。

btw:&amp;可以用来得到相交。

答案 1 :(得分:1)

在某些时候,需要迭代两个查询的结果集并创建User个对象。您可以将其添加到模板中,或者您可以在视图中执行此操作,构建setUser个对象(以消除重复项)。然后将该集合传递给模板,或将其转换为列表并首先对其进行排序。

有时候答案是在你的视野中做更多的工作。我不确定这种情况是否属于其中之一(您应该可以使用Q查询执行此操作),但这是一个值得记住的选项。

答案 2 :(得分:1)

所以这个问题很古老,但似乎你可以做到以下几点:

new_users_by_id = dict([(u.id, u) for u in new_users])
vehicles_shipped_by_id = dict([(v.id, v) for v in vehicles_shipped])
mapped_users = {}
for id in keys(new_users_by_id):
    mapped_users[id] = dict(new_users_by_id[id].__dict__.items() + vehicles_shipped_by_id[id].__dict__.items())

然后mapped_users将用户连接在一起。

这只是根据他们的ID映射两个列表,然后按照this SO solution to merge dicts中的说明将它们连接在一起。

答案 3 :(得分:0)

答案 4 :(得分:0)

可能this会帮助你吗?将两个查询集合在一起,让您将它们视为一个。

或者,在视图中使用list()对它们进行重击:overall_users = list(new_referrals)+ list(vehicles_shipped)