【问题标题】:Django REST serializer queryset: access model via reverse foreign key?Django REST 序列化程序查询集:通过反向外键访问模型?
【发布时间】:2020-01-11 18:02:59
【问题描述】:

我有一个表格,我想显示多个养老基金针对一项拟议投资的提款金额。我在表中的“投资”实例上编写了一个 for 循环。但是,我似乎无法从此循环中检索金额。我认为我的查询集“amountdrawdown”不正确,因为我正在尝试反向查找外键(从投资模型到 DrawdownOnFund 模型)。

我的 models.py,简化版:

class PensionFund(models.Model):
    name = models.CharField() 

class PensionFundDeposit(models.Model):
    PensionFund = models.ForeignKey(PensionFund)
    date = models.DateField()
    amount = models.DecimalField()
    undrawn = models.DecimalField()

class Investment(models.Model):          <---- Looping over this
    amount = models.DecimalField()
    date = models.DateField()

class DrawdownOnFund(models.Model):
    Investment = models.ForeignKey(Investment) 
    PensionFund = models.ForeignKey(PensionFund)
    date = models.DateField()
    amount = models.DecimalField()   <---- I would like to retrieve this

我的 serializer.py,简化版:

class PensionFundSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ['id', 'name']

class PensionFundDepositSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ['id', 'fund','date','amount','undrawn', 'fundname']

class InvestmentSerializer(serializers.ModelSerializer):
    amountdrawdown = serializers.CharField(source='drawdown.amount')  <---My attempt to write a query to retrieve the amount
    class Meta:
        fields = ['id', 'amount', 'date', 'amountdrawdown']

class DrawdownOnFundSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ['id', 'call', 'commitment', 'date', 'amount', 'callid']

【问题讨论】:

  • Investment 实例将有一个 DrawdownOnFund 模型实例列表,而不是单个实例,呈反向关系。

标签: django django-rest-framework django-queryset


【解决方案1】:

Investment -> DrawdownOnFund 具有一对多关系。因此,DrawdownonFund 将与Investment 实例之一有关系。而且,在反向类中(即Investment)将有一个DrawdownOnFund 实例列表,反向查找字段的名称是drawdownonfund_set(默认情况下)。

因此,考虑到这种情况,您想要显示与一项投资相关的所有资金回撤的列表,您应该使用嵌套序列化模式。

class DrawdownOnFundSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ['id', 'call', 'commitment', 'date', 'amount', 'callid']

class InvestmentSerializer(serializers.ModelSerializer):
    amountdrawdowns = DrawdownOnFundSerializer(many=True, source='drawdownonfund_set')
    class Meta:
        fields = ['id', 'amount', 'date', 'amountdrawdowns']

反序列化 Investment 模型的一个实例的输出将如下所示。 您可以通过管理DrawdownOnFundSerializer来控制amountdrawdowns中每一项的显示字段。

{
  "id": "1",
  "amount": "",
  "date": "",
  "amountdrawdowns": [
    {
      "id": "",
      "call": "",
      "commitment": "",
      "date": "",
      "amount": "",
      "callid": ""
    }  
  ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2021-04-08
    • 2016-01-25
    • 2020-05-10
    相关资源
    最近更新 更多