@Pythonist

Django Rest. Как сделать такой вложенный респонс?

Привет всем. Сейчас у меня такой ответ.
{
        "symbol": "ZERO",
        "costs": "6.1391",
        "timestamp": "2020-04-08T14:15:55.765835Z"
    },
    {
        "symbol": "ZERO",
        "costs": "6.1892",
        "timestamp": "2020-04-08T14:15:01.775659Z"
    },
    {
        "symbol": "ZERO",
        "costs": "6.1221",
        "timestamp": "2020-04-08T14:13:49.217715Z"
    },

Т е есть монета зеро (Джанго фильт применил, по полю названия монеты) и есть поле цены и времени. Поле названия монеты всегда тут zero и Соответсвенно нужно сделать так:
{"symbol":"ZERO","costs":[
    {"timestamp":"2019-12-14T00:00:07+00:00", "price":5.9505181}, 
    {"timestamp":"2019-13-14T00:00:07+00:00", "price":5.915181}, 
    {"timestamp":"2019-14-14T00:00:07+00:00", "price":6.915181}
    ]}

serializers.py

    class CoinCostsSerializer(serializers.ModelSerializer):
        symbol = serializers.ReadOnlyField(source='coin_id.symbol')
        costs = serializers.CharField(source='price')
        class Meta:
            fields = ('symbol', 'costs', 'timestamp')
            model = CoinCosts

views.py

    class CoinCostFilterSet(filters.FilterSet):
        
        class Meta:
            model = CoinCosts
            fields = {
                'coin_id__symbol': ['exact'],
                'timestamp': ['gt', 'lt'],
            }
    
    
    class CoinCostViewSet(viewsets.ModelViewSet):
    
        queryset = CoinCosts.objects.all()
        serializer_class = CoinCostsSerializer
        filter_backends = (filters.DjangoFilterBackend,)
        filterset_class = CoinCostFilterSet

Подскажите, как вложить таким образом ? Спасибо
  • Вопрос задан
  • 157 просмотров
Решения вопроса 1
tumbler
@tumbler
бекенд-разработчик на python
Отталкивайтесь от модели валюты, а не цен. Тогда одним объектом в ответе будет валюта, а не цена. Соответственно, все цены валюты вставляются через вложенный сериалайзер:
class CoinSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Coin
    costs = CoinCostSerializer(source='coincost_set.all', many=True)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы