【问题标题】:How can I use a serializer to retrieve data from a django model in a nested way?如何使用序列化程序以嵌套方式从 django 模型中检索数据?
【发布时间】:2021-08-08 07:56:41
【问题描述】:

我有一个包含 3 个字段的 django 模型:“product”、“price_1”和“price_2”。

我想序列化这个模型,结果是:

{
   "product": "some product",
   "price": {
      "price_1": 15.00,
      "price_2": 25.00
   }
}

我能够通过为价格创建模型并使用外键将其连接到产品模型来达到此结果。

#Models

class Product(models.Model):
   product = models.CharField()
   price = models.ForeignKey(Price)

class Price(models.Model):
   price_1 = models.FloatField()
   price_2 = models.FloatField()

#Serializers

class PriceSerializer(serializers.ModelSerializer):
   class Meta:
      model = Price
      fields = ['price_1', 'price_2']

class ProductSerializer(serializers.ModelSerializer):
   price = PriceSerializer()

   class Meta:
      model = Product
      fields = [
         "product", 
         "price",
      ]

它有效,但它非常无效。有没有办法让我达到相同的结果,但只有一个模型,例如:

class Product(models.Model):
   product = models.CharField()
   price_1 = models.FloatField()
   price_2 = models.FloatField()

如果我可以只有数字而没有“价格”这个词,那就更好了:

{
   "product": "some product",
   "price": {
      1: 15.00,
      2: 25.00
   }
}

虽然第二个结果更好,但如果我只用一个模型就可以实现第一个,我已经很高兴了。

提前致谢!

编辑:

这是我正在使用的视图:

class ProductReadAPIView(generics.RetrieveAPIView):
    lookup_field = 'pk'
    serializer_class = ProductSerializer

    def get_queryset(self):
        return Product.objects.all()

【问题讨论】:

  • 可以分享一下ModelViewSet吗?
  • 1: 2: 不是有效的 JSON:JSON 对象的键始终是字符串,因此 "1""2" 等,但不是 1 或 @ 987654331@.
  • 我也添加了视图。如果您需要任何其他信息,请告诉我。

标签: python django django-models django-rest-framework


【解决方案1】:

您可以使用source [DRF docs] 参数将整个对象传递给嵌套序列化程序,该序列化程序将只处理价格字段来执行此操作。

型号

class Product(models.Model):
   product = models.CharField()
   price_1 = models.FloatField()
   price_2 = models.FloatField()

序列化器

class ProductPriceSerializer(serializers.ModelSerializer):
   class Meta:
      model = Product
      fields = ['price_1', 'price_2']


class ProductSerializer(serializers.ModelSerializer):
   price = ProductPriceSerializer(source='*')

   class Meta:
      model = Product
      fields = [
         "product",
      ]

获取12 作为键会有点困难,我不会这样做,因为它会有点hacky。但是进一步看来,您的模型模式(两者)都没有标准化,实际上最好有不同的模型,以防您有多个价格要处理,下面的代码会更好地为您的用例建模:

class Product(models.Model):
   product = models.CharField()


class Price(models.Model):
   price = models.ForeignKey(Product)
   price = models.FloatField()  # use a DecimalField instead for prices!

【讨论】:

  • 谢谢。这个解释真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2013-05-05
  • 2018-07-04
  • 1970-01-01
相关资源
最近更新 更多