2009-11-16 38 views

回答

1

我一直在寻找:

  1. 从查询集QS得到vlqs(django.db.models.query.ValuesListQuerySet)

    vlqs = qs.values_list()

  2. 隐蔽vlqs列出

    MYLIST =列表(vlqs)

  3. 创建numpy的记录阵列

    R = np.core.records.array(MYLIST,名称= 'FIELD1,FIELD2,字段3')//名称是模型字段

6

这就像问“我如何将冰箱的内容转换成晚餐?”。这取决于你的冰箱里有什么,以及你想吃什么。简短的回答(相当于说“通过烹饪”)是迭代查询集,构建任何你想实例化数组的对象(通常是一个迭代和一个字典)。长的答案取决于你想要达到的目标。

+5

嗯... ...晚餐 – 2009-11-16 11:21:31

+2

感谢您的咨询!但我不会为这个明显的答案发布这个问题:)。 – Vishal 2009-11-16 19:31:23

11
import numpy as np 
qs = MyModel.objects.all() 
vlqs = qs.values_list() 
r = np.core.records.fromrecords(vlqs, names=[f.name for f in MyModel._meta.fields]) 

此用途QuerySet迭代器直接避免了创建python列表的时间和垃圾浪费步骤。它还使用MyModel._meta.fields从模型中获取实际字段名称,如Get model's fields in Django

中所解释的如果您只想将单个字段(例如模型的“票数”字段)提取为一维数组,你可以这样做:

vlqs = qs.values_list('votes', flat=True) 
votes = np.fromiter(vlqs, numpy.dtype('int_')) 
+1

这是一个很好的例子!其他窥视:请注意flat = True非常重要,以便values_list中的值是简单的值而不是元组:https://docs.djangoproject.com/en/1.8/ref/models/querysets/#values-list – 2015-09-19 17:23:14

1

你可以做的是:

[index[0] for index in qs.values_list('votes')] 

,并准备... XD

+0

请问指数[0]在做什么? – 2015-09-19 17:24:47

1

如果你想要让所有的对象和CRE的吃得对象numpy的数组作为数组的元素:

import numpy as np 
qs = MyModel.objects.all() 
numpy_array = np.array(list(qs)) 

根据我的工作,我用如下的内容:阵列的

import numpy as np  
qs = MyModel.objects.values_list('id','first_name','last_name').filter(gender='male').order_by('id') 
numpy_array = np.array(list(qs)) 

行对应于记录和阵列的列对应的数值是我在上面定义了(id,名字,姓氏)。

1

并把它变成一个整洁的小功能,您只需通过任何Django的查询集:

import pandas as pd 
import numpy as np 

def qs_to_df(qs): 
    """ QuerySet to DataFrame """ 
    Model = qs.model 
    np_array = np.core.records.fromrecords(qs.values_list(), names=[f.name for f in Model._meta.fields]) 
    return pd.DataFrame(np_array) 
0

都会响起@CpILL的答案,你可以把大部分的查询集成numpy的记录阵列像这样:

def qs_to_ra(qs, *args): 
    """ 
    Turn most querysets directly into a numpy record array 
    :param qs: django queryset 
    :param args: takes a list of field names to specify 
    :return: numpy.recarray 
    """ 
    model = qs.model 
    if args: 
     return np.core.records.fromrecords(qs.values_list(*args), names=args) 
    return np.core.records.fromrecords(qs.values_list(), names=[f.name for f in model._meta.fields]) 

您也可以将它们直接进入熊猫数据帧像这样:

def qs_to_df(qs, *args): 
    """ 
    Turn most querysets directly into a pandas dataframe. 

    :param qs: django queryset 
    :param args: takes a list of field names to specify 
    :return: pandas.DataFrame 
    """ 
    model = qs.model 
    if args: 
     return pd.DataFrame.from_records(list(qs.values_list(*args)), columns=args) 
    return pd.DataFrame.from_records(list(qs.values_list()), columns=[f.name for f in model._meta.fields])