如何在不对数据库进行下一次查询的情况下对django查询集进行操作

时间:2016-01-26 17:07:34

标签: python django orm query-optimization django-queryset

我是django的新手(我正在使用这个约1.5个月)。现在我正在研究django 1.6,所以我正在寻找修补程序,但在〜月之后我会使用django 1.9(最后!)。

我的问题是:如何才能对数据库进行一到两个更大的查询,而不是maaaaany小查询?我想收集所有组对象,然后搜索有趣的我对象或ID。使用这种数据库模式,我必须进行数十次查询才能添加ONE COMPLETE记录。 (每个数据都有~10个参数)。我在django 1.8中听说过'预制'的事情。这将是我下个月的答案?或者可以很好地使用select_related?

我必须对此进行优化,因为我可以使用数据解析excel文件并在2秒内创建json,但是在数据库上更新可能需要10分钟以上...

我正在读取所有记录行json文件,需要将其正确添加到此数据库中,例如:

//小写'数据'是我正在阅读的json对象表示。键位于[]括号中。

allParametersDef = ParameterDef.objects.all().values_list("name", flat = True) 

for record in allRecords:
    group = Group.objects.get_or_create( name = data[record]['Group name'])[0]
    dataToSave = Data( gatheredBy = group, date = data[record]['Date'])
    dataToSave.save()

        for parameter in allParametersDef:
            newParam = ParameterDef.objects.create( 
                data = dataToSave,
                value = data[record][parameter]['Value'],
                definition = ParameterDef.objects.get( name = parameter),
                description = data[record][parameter]['Description']
            )
            newParam.save()

数据有很多参数(参数是带有id,名称,描述和值的表)。 ParameterDef是参数的一般定义(定义例如单位)

如果你真的想考虑数据库的结构:

包含数据对象的表:

data
    -> each data has one FK with id to group object (who gathered data)    
    -> few parameters, each has FK to data
        -> each parameter has FK to his data object 
        -> each parameter has value 
        -> each parameter has FK to his parameter definition
        -> each parameter has string with additional description

例如我们有数据对象     {'群组名称':'Gryffindor','日期':'01 -01-2000'}

并且此对象嵌套了几个参数:

{ data: [there is FK to data], value: 123, definition [there is FK to ParameterDef of temperature], description: 'Gathered at very windy and rainy day'}
{ data: [there is FK to data], value: 30, definition [there is FK to ParameterDef of humidity], description: 'It was raining about 70% of the day'}
{ data: [there is FK to data], value: 70, definition [there is FK to ParameterDef of breziness], description: ''}

1 个答案:

答案 0 :(得分:4)

我看到你正在通过model.objects.create创建多个对象。使用bulk_create可以提高效率。

您可以将对象存储在列表中,而无需先调用create,如:

new_param_list = []
for parameter in allParametersDef:
    newParam = ParameterDef(data=dataToSave,
                            value=data[record][parameter]['Value'],
                            definition=ParameterDef.objects.get( name = parameter),
                            description = data[record][parameter]['Description'])
    new_param_list.append(newParam)

ParameterDef.objects.bulk_create(new_param_list)

另外,您不能在save()之后致电create()。他们正在做同样的事情,save()没有必要。