我有两个不同的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_referrals
和vehicles_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"
答案 0 :(得分:1)
对于大多数应用程序,除了默认的django queryset组合之外,您真的不需要任何其他内容。这将合并到主键上。
combined = new_referrals | vehicles_shipped
我真的很惊讶这在django文档中找不到,这种行为已经很老了。你应该拿出一张票。
btw:&amp;可以用来得到相交。
答案 1 :(得分:1)
在某些时候,需要迭代两个查询的结果集并创建User
个对象。您可以将其添加到模板中,或者您可以在视图中执行此操作,构建set
个User
个对象(以消除重复项)。然后将该集合传递给模板,或将其转换为列表并首先对其进行排序。
有时候答案是在你的视野中做更多的工作。我不确定这种情况是否属于其中之一(您应该可以使用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)