我正在尝试向我的数据库发出一个queryset请求,我想从响应中排除整个列,在这种情况下是列权重。但响应是从数据库返回所有列。我试图使用延迟,但它不起作用。
我做错了什么?
Views.py
def product_table(request):
width = request.GET['width']
length = request.GET['length']
prod_filter = Product.objects.filter(length=length,width=width).defer('weigth')
data_prod =serializers.serialize('json', prod_filter)
return JsonResponse({'data_prod':data_prod})
HTML
...
<div>
<table id="id_prod" class="table table-striped table-bordered table-hover"></table>
</div>
<script>
$(document).ready(function(){
...
$.get('{% url "prod_table" %}',function (data_prod) {
var data_json = JSON.parse(data_prod['data_prod']);
var data_array = [];
for(var i = 0; i < data_json.length; i++) {
var arr = $.map(data_json[i]['fields'], function(el) { return el });
data_array.push(arr);
}
$('#id_prod').DataTable({
destroy: true,
data: data_array,
columns: [
{ title: "Name" },
{ title: "width" },
{ title: "length" },
{ title: "volume" },
]
});
});
答案 0 :(得分:1)
您的defer()
调用阻止Django在获取查询集时加载列。但是,您的序列化程序需要延迟字段的值,因此稍后将获取该值。这意味着如果你根本没有使用延迟,你实际上最终会做更多的查询!
如果您只想serialize a subset of the fields,那么在序列化查询集时需要指定fields
:
data_prod =serializers.serialize('json', prod_filter, fields=['width', 'length', ...)
请注意,实际上,.defer('weight')
优化可能不是必需的。在实践中,您可能看不到任何明显的查询时间减少。
答案 1 :(得分:0)
正如@Alasdair所说,你需要告诉你的seralizer不要返回你不想要的字段。只使用defer()
只是告诉Django等待从数据库加载该列,直到你使用它。因此,如果序列化程序尝试序列化该字段的值,则将读取该字段。 defer()
不阻止您使用该字段,它只是推迟检索。
具有延迟字段的查询集仍将返回模型实例。 如果您访问,将从数据库中检索每个延迟字段 该字段(一次一个,而不是一次所有延迟字段)。