Подтвердить что ты не робот

Преобразование Django QuerySet в pandas DataFrame

Я собираюсь преобразовать QuerySet Django в pandas DataFrame следующим образом:

qs = SomeModel.objects.select_related().filter(date__year=2012)
q = qs.values('date', 'OtherField')
df = pd.DataFrame.from_records(q)

Это работает, но есть ли более эффективный способ?

4b9b3361

Ответ 1

import pandas as pd
import datetime
from myapp.models import BlogPost

df = pd.DataFrame(list(BlogPost.objects.all().values()))
df = pd.DataFrame(list(BlogPost.objects.filter(date__gte=datetime.datetime(2012, 5, 1)).values()))

# limit which fields
df = pd.DataFrame(list(BlogPost.objects.all().values('author', 'date', 'slug')))

Выше было то, как я делаю то же самое. Самое полезное дополнение - это указать, какие поля вам интересны. Если это только подмножество доступных полей, которые вас интересуют, тогда это даст повышение производительности, я думаю.

Ответ 2

Django Pandas решает это довольно аккуратно: https://github.com/chrisdev/django-pandas/

Из README:

class MyModel(models.Model):
    full_name = models.CharField(max_length=25)
    age = models.IntegerField()
    department = models.CharField(max_length=3)
    wage = models.FloatField()

from django_pandas.io import read_frame
qs = MyModel.objects.all()
df = read_frame(qs)

Ответ 3

С точки зрения Django (я не знаком с pandas) это нормально. Меня беспокоит только то, что если у вас очень большое количество записей, вы можете столкнуться с проблемами памяти. Если бы это было так, то было бы необходимо что-то вроде этого памяти, эффективного итератора запросов. (В качестве отрывка, как написано, может потребоваться некоторое переписывание, позволяющее использовать интеллектуальное использование .values()).

Ответ 4

Возможно, вы можете использовать model_to_dict

import datetime
from django.forms import model_to_dict
pallobjs = [ model_to_dict(pallobj) for pallobj in PalletsManag.objects.filter(estado='APTO_PARA_VENTA')] 
df = pd.DataFrame(pallobjs)
df.head()