Как мне преобразовать django QuerySet в массив записей? - PullRequest
11 голосов
/ 16 ноября 2009

Как мне преобразовать django QuerySet в массив пустых записей?

PS: я знаю, что вы можете итерировать и создавать его, но есть ли более чистое решение?

Ответы [ 7 ]

15 голосов
/ 01 декабря 2010
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 для получения реальных имен полей из модели, как описано в Получить поля модели в Django

Если вы просто хотите, чтобы одно поле (например, поле «голоса» модели) было извлечено в одномерный массив, вы можете сделать:

vlqs = qs.values_list('votes', flat=True)
votes = np.fromiter(vlqs, numpy.dtype('int_'))
5 голосов
/ 16 ноября 2009

Это все равно, что спросить: «Как мне перевести содержимое моего холодильника в обед?». Это зависит от того, что у вас в холодильнике и что вы хотите съесть. Короткий ответ (эквивалентный тому, чтобы сказать «готовя») состоит в том, чтобы выполнить итерацию по набору запросов, создав объекты из любых типов составных данных, с которыми вы хотите создать экземпляр массива (обычно итерируемый и словарь). Длинный ответ зависит от того, чего вы на самом деле хотели бы достичь.

2 голосов
/ 08 декабря 2015

Если вы хотите получить все свои объекты и создать пустой массив с объектами в качестве элементов массива:

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

Строки массива соответствуют записям, а столбцы массива соответствуют значениям, которые я определил выше (идентификатор, имя, фамилия).

1 голос
/ 14 февраля 2017

И чтобы поместить его в аккуратную маленькую функцию, которой вы просто передаете любой Django Queryset:

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)
1 голос
/ 14 августа 2013

что вы могли бы сделать:

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

и готово ... XD

1 голос
/ 17 ноября 2009

Что я искал:

  1. Из QuerySet qs получить vlqs (django.db.models.query.ValuesListQuerySet)

    vlqs = qs.values_list ()

  2. Скрытые vlqs к списку

    mylist = list (vlqs)

  3. Создать массив пустых записей

    r = np.core.records.array (mylist, names = 'field1, field2, field3') // Имена - это поля модели

0 голосов
/ 25 мая 2017

Исходя из ответа @CpILL, вы можете превратить большинство наборов запросов в массив пустых записей, например:

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...