Django模型集查找非常慢

时间:2019-05-14 13:27:55

标签: python mysql django

我在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数据库。我还希望有人会告诉我不要使用字符串作为交叉表标识符,但是我怀疑这就是原因。

我确定我在做一些明显的错误,但是希望您能有所指点,谢谢。

2 个答案:

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

使用Many-to-one relationship

scan_name = ForeignKey(Scan, related_name='processing_infos',on_delete=models.CASCADE)