我在Django模型中的查找速度非常慢。
我有两个表:
class Scan(models.Model):
scan_name = models.CharField(max_length=32, unique=True, validators=[alphanumeric_plus_validator])
class ScanProcessingInfo(models.Model):
scan_name = models.CharField(max_length=32)
processing_name = models.CharField(max_length=64)
in_progress = models.BooleanField(default=False)
当我执行以下操作以获取具有特定处理名称的ScanProcessingInfo的所有Scan对象的列表时:
scans = models.Scan.objects.all()
scan_set = []
for scan in scans:
if self.set_type_definition.test_scan(scan, self.arg1, self.arg2):
scan_set.append(scan)
(test_scan routes to)
def get_proc_info_been_done(scan, spd_name):
try:
proc_info = models.ScanProcessingInfo.objects.get(scan_name = scan.scan_name)
except models.ScanProcessingInfo.DoesNotExist:
proc_info = None
if proc_info == None:
return False
return not proc_info.in_progress
该请求大约需要10秒钟。总共有300个扫描和10个ScanProcessingInfos。数据库后端是RDS MySQL数据库。我还希望有人会告诉我不要使用字符串作为交叉表标识符,但是我怀疑这就是原因。
我确定我在做一些明显的错误,但是希望您能有所指点,谢谢。
答案 0 :(得分:3)
我认为您要问的是如何获取具有匹配ScanProcessingInfo的所有扫描。
要做的第一件事是声明实际的关系。您不需要更改数据库(应该,但不必);您可以使用现有的基础字段,但只需告诉Django将其视为外键即可。
class ScanProcessingInfo(models.Model):
scan = models.ForeignKey('Scan', to_field='scan_name', db_field='scan_name', on_delete=models.DO_NOTHING)
现在,您可以使用这种关系一次性获得所有扫描:
scan_set = Scan.objects.exclude(scanprocessinginfo=None)
修改
要获取具有特定属性的所有匹配对象,请使用双下划线语法:
scan_set = Scan.objects.filter(scanprocessinginfo__processing_name=spd_name)
答案 1 :(得分:0)
scan_name = ForeignKey(Scan, related_name='processing_infos',on_delete=models.CASCADE)