python - 从 Django 模型返回 JSON 格式的子属性

标签 python json django django-rest-framework

我在 Django 中设置了一个数据库模型来跟踪投资组合,并尝试开发一个 API 来返回投资组合以及其中的每个代币,以及与该代币关联的每笔交易。但是,使用 API 我只能看到返回的模型的名称字段。一些用于澄清的代码:

模型.py:

class Portfolio(models.Model):

    name = models.CharField(max_length=250)
    @property
    def coins(self):
        return Coin.objects.filter(portfolio=self)

    def transactions(self):
        return Transaction.objects.filter(portfolio=self)

    def __str__(self):
        return self.name


class Coin(models.Model):
    portfolio = models.ForeignKey(Portfolio, on_delete=models.PROTECT)
    name = models.CharField(max_length=100)
    symbol = models.CharField(max_length=5)
    price = models.DecimalField(max_digits=20, decimal_places=9)
    info = models.TextField()
    website = models.TextField()
    rank = models.IntegerField()

    def __str__(self):
        return self.name + " - " + self.symbol


class Transaction(models.Model):
    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE)
    coin = models.ForeignKey(Coin, on_delete=models.PROTECT)
    purchaseDate = models.DateTimeField()
    soldDate = models.DateTimeField(default=None, null=True, blank=True)
    amount = models.DecimalField(max_digits=20, decimal_places=3)
    price = models.DecimalField(max_digits=20, decimal_places=9)

    def __str__(self):
        return self.coin.name + " - " + str(self.amount) + " At $" + str(self.price)

我的 json 序列化器:

class PortfolioSerializer(serializers.ModelSerializer):
    class Meta:
        model = Portfolio
        fields = '__all__'

数据如何返回:

 HTTP 200 OK
    Allow: GET, POST, HEAD, OPTIONS
    Content-Type: application/json
    Vary: Accept

    [
        {
            "id": 3,
            "name": "Binance"
        }
    ]

我想要的是在数据集中,在 binance 下它应该显示一个硬币对象列表,其中包含每个硬币的交易列表。

最佳答案

你真的应该阅读Django-Rest-Framework docs :

class Portfolio(models.Model):

    name = models.CharField(max_length=250)
    @property
    def coins(self):
        return Coin.objects.filter(portfolio=self)

    def transactions(self):
        return Transaction.objects.filter(portfolio=self)

    def __str__(self):
        return self.name


class Coin(models.Model):
    portfolio = models.ForeignKey(Portfolio, relared_name="coins" ,on_delete=models.PROTECT)
    name = models.CharField(max_length=100)
    symbol = models.CharField(max_length=5)
    price = models.DecimalField(max_digits=20, decimal_places=9)
    info = models.TextField()
    website = models.TextField()
    rank = models.IntegerField()

    def __str__(self):
        return self.name + " - " + self.symbol

在您的 PortfolioSerializer 中:

class PortfolioSerializer(serializers.ModelSerializer):
    coins = CoinSerializer(many=True, read_only=True)
    class Meta:
        model = Portfolio
        fields = '__all__'

这里应该在PortfolioSerializer上面写一个CoinSerializer,如:

class CoinSerializer(serializers.ModelSerializer):
        class Meta:
            model = Coin
            fields = '__all__'

关于python - 从 Django 模型返回 JSON 格式的子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48217170/

相关文章:

python - Django 中的 db_type (尝试安装 pootle w/mysql)

python - 如何在 Django 的 Crispy Form 中添加 CaptchaField()?

python - 如何从BoundField获取数据?

python - 使用 for 循环附加多个 pandas 数据帧但返回空数据帧

python - 在 django 模型中类型转换对象

python - 如何在 x 轴上绘制数据帧值并在 y 轴上绘制索引

json - jqGrid 将纪元时间(从毫秒开始)显示为日期时不排序

json - 遍历嵌套的 JSON 对象并使用 Python 获取值

python - 二次根函数中的数学域错误

javascript - 如何使用 React-native-element 复选框和 FlatList React Native 处理从 json 获取的复选框?