我正在编写一个脚本,我希望从访问过的网站中获取每一个值。
首先我访问了网站:
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,并从相应的页面获取关键字。如果同一页面通常是最后一页,我想增加更多权重,如前所述。
如果需要更多信息,请告诉我,再次感谢!
答案 0 :(得分:1)
&#34; __ in&#34; django中的过滤器只返回唯一条目?
Django中的__in
过滤器直接映射到SQL中的IN
条件,其行为正如您所观察到的那样。
如果您想要重复的行,您应该将查询重新定义为SQL JOIN
。你没有发布你的模型所以我不得不在这里猜测,但是下面的Django查询应该给你你想要的东西:
KeywordData.objects.filter(page__session_last_page__session_id__mlsession__platform=2)
答案 1 :(得分: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]