我是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: ''}
答案 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()
没有必要。