[英]Django - Following A Foreign Key To Another Foreign Key
我正在嘗試加快模型的查找速度。 我有3個模型。
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具有要設置的外鍵
data_parsed:300萬行
unique_variables:1300萬行
然后,我有一些代碼試圖遍歷所有data_parsed對象。
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上的相同字段。 我可以使用data_parsed的foriegn鍵獲取unique_variables中的項目。 因此:
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。
有沒有一種方法可以加快這種行為的獲取速度?
是的,您可以使用prefetch_related 。 我已經為您鏈接了文檔。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.