Как получить "исторический" Queryset для набора данных с помощью Django ORM?

У меня есть CurrencyHistory модель вместе с таблицей базы данных, которая заполняется при каждом обновлении Currency модели для исторических данных.

class CurrencyHistory(models.Model):
    id = models.AutoField(primary_key=True)
    change_rate_date = models.DateTimeField(_("Change Rate Date"), 
                                        auto_now=False, auto_now_add=True, 
                                        db_column='change_rate_date')

    code = models.ForeignKey("core.Currency", verbose_name=_("Code"), 
                         on_delete=models.CASCADE,
                         related_name='history',
                         db_column='code')

    to_usd_rate = models.DecimalField(_("To USD Rate"), 
                                  max_digits=20, 
                                  decimal_places=6, 
                                  null=True, 
                                  db_column='to_usd_rate')

Структура базы данных выглядит как

id | change_rate_date | code | to_usd_rate
 1 | 2021-01-01       | EUR  | 0.123456
 2 | 2021-01-01       | CAD  | 0.987654
 3 | 2021-01-02       | EUR  | 0.123459
 4 | 2021-01-02       | CAD  | 0.987651

Мне нужно получить данные с помощью Djnago ORM, чтобы иметь словарь для отображения одной строки на дату с каждой валютой в качестве столбцов, как это

Date EUR CAD
2021-01-01 0.123456 0.987654
2021-01-02 0.123459 0.987651

Но я понятия не имею, как правильно это сделать, используя Django ORM, чтобы это было быстро.

Полагаю, что цикл for по всем уникальным датам базы данных для получения dict для для каждой даты будет работать в этом случае, но это выглядит очень медленным решением, которое будет генерировать тысячи запросов.

Вы хотите использовать serailizers для превращения экземпляра модели в словарь. Даже если вы не используете RESTFUL api, serailizers - лучший способ получить словари.

Все виды способов сериализации данных Преобразование объекта Django Model в dict со всеми нетронутыми полями

Для краткого обзора моих самых любимых методов...

Метод 1.

Модель в дикт

from django.db.form import model_to_dict

instance = CurrencyHistory(...)
dict_instance = model_to_dict(instance)

Метод 2:

Серализаторы (здесь будет показано наиболее подробно)

конечно, это подразумевает, что вам нужно будет установить DRF

pip install rest_framework

Serializers.py

# import your model
from rest_framework import serializers


class CurrencySerialzier(serializers.ModelSerializer):
    code = serializers.StringRelatedField()  # returns the string repr of the model inst
    class Meta:
        model = CurrencyHistory
        fields = "__all__"

views.py

from .serializers import CurrencySerializer
...inside your view

currency_inst = CurrencyHistory.objects.get()
serializer = CurrencySerializer(currency_inst)
serializer.data # this returns a mapping of the instance (dictionary)

# here is where you either return a context object and template, or return a DRF Response object
Вернуться на верх