簡體   English   中英

Django中的一對多查詢集

[英]One to many queryset in django

我有2個表,Item和UserDetail。 在表Item中,我有以下item_id和item_name: 在此處輸入圖片說明

我的UserDetail表如下: 在此處輸入圖片說明

我需要獲取用戶的用戶名,以及他們的最新更新信息(例如,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的身份訪問數據。 這樣,如果用戶缺少任何項目,它將顯示為空白,如下所示: 在此處輸入圖片說明

ItemUserDetail之間使用正式的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM