从django查询中获取非唯一值

时间:2017-08-14 17:46:51

标签: python mysql 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 个答案:

答案 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]