Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django的一对多查询集_Python_Django - Fatal编程技术网

Python django的一对多查询集

Python django的一对多查询集,python,django,Python,Django,我有两个表,Item和UserDetail。在表Item中,我有Item_id和Item_名称,如下所示: 我的UserDetail表如下所示: 我需要获得用户的用户名和最新更新(例如,Tina的教育水平在2015年1月5日为理学学士,2017年1月5日改为理学硕士。因此,我必须根据她的教育水平选择理学硕士)、电子邮件、家庭电话、手机和教育信息。对于任何丢失的信息,我将其保留为空白。因此,我的结果是: [{'username':John, 'email':'john@abs.com', 'h

我有两个表,Item和UserDetail。在表Item中,我有Item_id和Item_名称,如下所示:

我的UserDetail表如下所示:

我需要获得用户的用户名和最新更新(例如,Tina的教育水平在2015年1月5日为理学学士,2017年1月5日改为理学硕士。因此,我必须根据她的教育水平选择理学硕士)、电子邮件、家庭电话、手机和教育信息。对于任何丢失的信息,我将其保留为空白。因此,我的结果是:

[{'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'},]
目前,我在my view.py中有这样的查询集:

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'}....]
而且,返回结果需要更多的时间。有人对此有好的建议吗

对此添加更多评论:

现在,我有如下数据:

[[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'}....]
因此,当我在模板中呈现数据时,我可以访问I.username、I.email、I.homePhone、I.mobile、I.education等数据。这样,如果用户缺少任何项目,它将显示为空白,如下所示:
我不太清楚您的数据库结构。但是如果你想要最新的唱片,你可以得到它们

queryset = UserDetail.objects.all().latest('date_recorded').distinct()
此外,您还可以添加过滤器,以获取ids中的ID或任何您想要的ID。
我还在queryset上应用了distinct(),以便只有唯一的记录

用户详细信息
之间使用正式的
外键
关系可能是有意义的,因为这种关系是一对多的

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()

谢谢你,威尔!但是,在查询UserDetail之后,users\u data变为:Yes您看到的
users\u data
queryset(可能使用调试器?)将显示未分组的数据。随后的代码使用
defaultdict
以所需的格式对数据进行分组和构造。您认为by_username.values()的输出是什么??我可以获取by_username的用户名[用户数据['username']]['username']。但是,我得到user\u data.item\u name的属性错误。是的,您需要使用
user\u data.item.item\u name