Как получить "исторический" 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