首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django -跟踪外键到另一个外键

Django -跟踪外键到另一个外键
EN

Stack Overflow用户
提问于 2015-03-07 00:09:13
回答 1查看 61关注 0票数 0

我在试着加快我的模特的查找速度。我有三个模特。

代码语言:javascript
运行
复制
class sett(models.Model):
    setid = models.IntegerField(primary_key=True)
    block = models.ForeignKey(mapt, related_name='sett_block')

class data_parsed(models.Model):
    setid = models.ForeignKey(sett, related_name='data_parsed_setid', primary_key=True, db_index = True)
    setid_hash = models.CharField(max_length=100, db_index = True)

class unique_variables(models.Model):
    setid = models.ForeignKey(sett, related_name='unique_variables_setid', db_index = True)
    setid_hash = models.CharField(max_length=100, db_index = True)

最重要的是,sett有一个名为setid的主键,它:

data_parsed和unique_variables有一个用于setid的外键

data_parsed: 300万行

unique_variables: 1300万行

然后,我有一些代码试图遍历所有的data_parsed对象。

代码语言:javascript
运行
复制
def something_1():
    timeNow = datetime.datetime.now()
    for i in range(0,N) <---- N is predefined, and no less than 10
        for contents in data_parsed.objects.all().iterator():
            pass
    timeEnd = datetime.datetime.now()
    print str(timeEnd - timeNow)

data_parsed有几百万个项目,大约需要20秒才能完成,我认为这个速度相当快。

现在,因为setid在data_parsed和unique_variables上都是相同的字段。我可以使用unique_variables中的data_parsed键获取项目。因此:

代码语言:javascript
运行
复制
def something_2():
    timeNow = datetime.datetime.now()
    for i in range (0, N) <---- N is predefined, and no less than 10
        for contents in data_parsed.objects.all().iterator():
            try:
                items = unique_variables.objects.get(setid = contents.setid)
            except:
                pass
    timeEnd = datetime.datetime.now()
    print str(timeEnd - timeNow)

然而,问题是,这突然消耗了几个小时的时间。因为我不能使用select_related,因为我不会返回到sett,而是实际上从sett迁移到unique_variables。

有什么方法可以加速使用这种行为获取物品吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-07 00:39:50

是的,你可以使用相关。我已经帮你把文件联系起来了。

代码语言:javascript
运行
复制
def something_2():
    timeNow = datetime.datetime.now()
    for i in range (0, N) <---- N is predefined, and no less than 10
        parsed_objects = data_parsed.objects.all().prefetch_related(
            'setid__unique_variables_setid')
        for contents in parsed_objects:
            try:
                items = list(contents.setid.unique_variables_setid.all())
            except:
                pass
    timeEnd = datetime.datetime.now()
    print str(timeEnd - timeNow)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28909781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档