2017-08-14 69 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!我一直在试图解决这个问题,但是如果您能够轻松地看到解决这个特定问题的解决方案,我会尽快回复。 –