[英]One to many queryset in django
我有2个表,Item和UserDetail。 在表Item中,我有以下item_id和item_name:
我需要获取用户的用户名,以及他们的最新更新信息(例如,Tina的学历于2015年5月1日获得理学学士学位,并于2017年5月1日更改为MSc。所以我必须选择她的学历为MSc),电子邮件,家用电话,手机和教育信息。 对于任何缺少的信息,我将其保留为空白。 所以我的结果是:
[{'username':John, 'email':'john@abs.com', 'homePhone':'', 'cellPhone':'', 'education':''},
{'username':Jade, 'email': jade@email.com, 'homePhone':111 456-7890, 'cellPhone':'','education':''},
{'username':Tina, 'email':'', 'homePhone':'', 'cellPhone':'211 234-5678', 'education':'Msc'},]
目前,我的view.py中有这样的queryset:
items=Item.objects.filter(Q(item_id__in=(2, 3, 4, 6))).values('item_name').order_by('item_id')
users=[username1, username2, ...]
for user in users:
users_data = UserDetail.objects.filter(username=username)\
.filter(Q(id__in=(2,3, 4, 6)).values('id','record')\
.order_by('id').latest(DateRecorded)
qs1=[user]
for item in items:
for value in users_data:
user_data=''
if item['item_id']== value['id']:
user_data=value['record']
break
qs1.append(data)
qs2.append(qs1)
这样就可以了。 但是,qs2的格式与我期望的格式不完全相同。 我得到这样的qs2:
[[u'John', u'john@abs.com', u'', u'', u''],
[u'Jade', u'jade@email.com', u'111 456-7890',u'',u''],
[u'Tina', u'', u'', u'211 234-5678', u'mac'],]
此外,它需要更多时间才能获得结果。 有人对此有好的建议吗?
在此添加更多评论:
现在,我有这样的数据:
users_data= <QuerySet [{u'username': u'john', u'id': u'2', u'record': u'joh@abc.com'},
{u'username': u'jade', u'id': u'2', u'record': u'jade@email.com'},
{u'username': u'jade', u'id': u'3', u'record': u'111 456-7890'}....]
希望构建最终数据,例如:
by_username = [{u'username': u'john', u'email': u'joh@abc.com'},
{u'username': u'jade', u'homePhone': u'111 456-7890'}]
因此,当我在模板中呈现数据时,我可以以i.username,i.email,i.homePhone,i.cellPhone,i.education的身份访问数据。 这样,如果用户缺少任何项目,它将显示为空白,如下所示:
在Item
和UserDetail
之间使用正式的ForeignKey
关系可能是有意义的,因为该关系是一对多的。
class UserDetail(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
...
然后,您可以更有效地查询所需的数据:
usernames = [username1, username2, ...]
items = [2, 3, 4, 6]
users_data = UserDetail.objects.filter(username__in=usernames, item__in=items)\
.select_related('item')\
.order_by('item_id').latest(DateRecorded)
然后根据需要构建结果:
from collections import defaultdict
by_username = defaultdict(dict)
for user_data in users_data:
by_username[user_data['username']]['username'] = user_data['username']
by_username[user_data['username']][user_data.item.item_name] = [user_data.record]
return by_username.values()
我不清楚您的数据库结构。 但是,如果您想要最新记录,则可以获取它们!
queryset = UserDetail.objects.all().latest('date_recorded').distinct()
您也可以添加过滤器以获取ID或所需的ID。 我还对queryset应用了distinct(),以便仅具有唯一记录
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.