复杂的嵌套数据表示

时间:2017-12-11 20:54:54

标签: python django

我试图获取所有Currency个对象,其中Ticker个对象嵌套在每个货币对象中。到目前为止,我只能用里面的货币对象获取代码,但这真的不方便吗?我不确定我需要做些什么来实现以下输出

所以我想要的是这样的东西:

[
    {
        "id": 1,
        "name": "Dollar",
        "symbol": "USD"
        "ticker": [
            {
                "id": 1,
                "rank": 1,
                "price_dkk": 123.25
            }
        ]
    }
]

模型

class Currency(models.Model):
    symbol = models.CharField(max_length=4, default='BTC', unique=True)
    name = models.CharField(max_length=20, default='Bitcoin', unique=True)
    img = models.ImageField(upload_to = 'static/img/currencies', blank=True)
    is_active = models.BooleanField(default=False)
    class Meta:
        verbose_name_plural = _('currencies')

    def __str__(self):
        return self.name


class Ticker(models.Model):
    currency = models.ForeignKey('Currency', on_delete=models.CASCADE)
    rank = models.IntegerField()
    price_dkk = models.DecimalField(max_digits=20, decimal_places=6)
    market_cap_dkk = models.BigIntegerField()
    percent_change_1h = models.DecimalField(max_digits=4, decimal_places=2)
    percent_change_24h = models.DecimalField(max_digits=4, decimal_places=2)
    percent_change_7d = models.DecimalField(max_digits=4, decimal_places=2)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = _('Ticker')

    def __str__(self):
        return self.id

串行

class CurrencyTickerSerializer(serializers.HyperlinkedModelSerializer):
    currency = serializers.PrimaryKeyRelatedField(many=False, queryset=Currency.objects.all())
    class Meta:
        model = Ticker
        fields = ('currency', 'rank', 'price_dkk', 'market_cap_dkk', 'percent_change_1h', 'percent_change_24h', 'percent_change_7d',)

查看

class CurrencyTickerGetView(ProtectedResourceView):
    def get(self, request):
        tickers = CurrencyTickerSerializer(Ticker.objects.all(), many=True)

        return JsonResponse(tickers.data, safe=False)

1 个答案:

答案 0 :(得分:0)

您想使用嵌套关系。 http://www.django-rest-framework.org/api-guide/relations/#nested-relationships

您需要两个序列化程序。一个适合您的货币模型,另一个适用于您的代码..

在您的货币序列化程序中,您需要引用故障单序列化程序。

class CurrencySerializer(serializers.ModelSerializer):
     tickers = CurrencyTickerModelSerializer(many=True)
     ...

在您的视图中获取您要序列化的所有货币,并确保预先填充了您将提前序列化的代码,或者您最终可能会遇到大量查询。