2017-08-14 42 views
2

我正在編寫一個腳本,我希望從訪問的網站獲取每次出現的值。從Django查詢中獲取非唯一值

首先,我得到訪問的網站:

sd = SessionData.objects.filter(session_id__mlsession__platform__exact=int('2')) 
result = sd.values('last_page') 

然後我拿到我期待值:

[{'last_page': 10L}, {'last_page': 4L}, {'last_page': 10L}] 

就這樣,我想和10L的頁面作爲一個id有雙4L的重量,因爲它出現了兩次。

我嘗試從列表中的值:

wordData = KeywordData.objects.filter(page_id__in=result) 

但當時我只得到唯一值:

[<KeywordData: 23>, <KeywordData: 24>, <KeywordData: 8>] 

那裏我想要的結果將是:

[<KeywordData: 23>, <KeywordData: 24>, <KeywordData: 8>, <KeywordData: 23>, <KeywordData: 24>] 

我設法得到一個唯一列表的唯一方法是迭代for循環,但這不是一個真正的選擇我正在處理的數據有數百萬條記錄。

django中的「__in」過濾器是否僅返回唯一條目?有沒有一種方法可以正確輸出「django」?

非常感謝您的幫助!

編輯:相關機型:

class KeywordData(models.Model): 
    page = models.ForeignKey(Page, db_column='page_id', related_name='page_pageid', default=None) 
    site = models.ForeignKey(Page, db_column='site_id', related_name='page_siteid', default=None) 
    keywords = models.CharField(max_length=255, blank=True, null=True, default=None) 

class MLSession(models.Model): 
    session = models.ForeignKey(Session, null=True, db_column='session_id') 
    platform = models.IntegerField(choices=PLATFORM_CHOICE) 
    visitor_type = models.IntegerField(default=1) 

class SessionData(models.Model): 
    session = models.ForeignKey(Session, db_column='session_id', on_delete=models.CASCADE) 
    site = models.ForeignKey(Site, db_column='site_id', db_index=True, default=None, null=True) 
    last_page = models.ForeignKey(Page, db_column='last_page_id', default=None, null=True, related_name='session_last_page') 
    first_page = models.ForeignKey(Page, db_column='first_page_id', default=None, null=True, related_name='session_first_page') 

的表格會議在它們的ID,這是自動遞增的術語僅提及。

我想看看會話的最後一頁,因此只需要看看last_page_id,並從各個頁面獲取關鍵字。如果同一頁面通常是最後一頁,我想增加更多的權重,如前所述。

讓我知道是否需要更多信息,並再次感謝!

+2

請出示你的'SessionData'和'KeywordData'模式 –

+0

我現在又增加了他們。 :) –

回答

1

django中的「__in」過濾器是否只返回唯一的條目?

在Django的__in過濾器直接映射到SQL中的IN條件,其行爲是因爲你所觀察到。

如果你想要重複的行,你應該重新將你的查詢重新設置爲SQL JOIN。所以我不得不在這裏猜你沒有張貼您的模型,但下面的Django查詢應該給你你想要的東西:

KeywordData.objects.filter(page__session_last_page__session_id__mlsession__platform=2) 
+0

謝謝你的答案。通過這樣做,我可以從會話中獲取所有使用平臺號的關鍵字。 2,但我只想要來自流程最後一頁的關鍵字。你知道任何簡單的方法來做到這一點?謝謝! –

+0

@HelgaSigurðardóttir:如果你指定''JOIN'' session_last_page'字段應該得到你想要的。看我的編輯。 –

+0

這個工程,非常感謝你! –

0

創建由頁面ID鍵入關鍵字的字典:

from collections = defaultdict 

result = sd.values_list('last_page', flat=True) 
keywords_by_page_id = defaultdict(list) 
for k in KeywordData.objects.filter(page_id__in=result): 
    keywords_by_page_id[k.page_id].append(k) 

然後通過result循環來構建您的所需輸出。

out = [] 
for x in results: 
    out += keywords_by_page_id[x] 
+0

謝謝你的回答。確實輸出不再是唯一的,但是我得到了[],所以它採用與最後一頁ID相同的ID而不是它自己的ID。我會更仔細地看看in_bulk,看看我能否找到解決方案,謝謝! –

+0

噢......'in_bulk'不會起作用,因爲'result'是'page_id's列表,而不是KeywordData ID。你應該能夠通過創建自己的字典來創建自己的字典,這個字典是由'page_id's – Alasdair

+0

感謝您的全力幫助,但是這隻會爲每個page_id分配一個關鍵字。 :)對於'page_id = 4'我想要'keyword_id = 8'和'page_id = 10'我想要'keyword_id = 23,keyword_id = 24'。但是,通過這個解決方案,我得到了'{10L:,4L:''。 所以現在它跳過單詞ID而不是頁面ID!我一直在試圖解決這個問題,但是如果您能夠輕鬆地看到解決這個特定問題的解決方案,我會盡快回復。 –