Преобразование 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)
Это работает, но есть ли более эффективный способ?
Ответы
Ответ 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()