【问题标题】:Django API Framework - Nested Models ViewDjango API 框架 - 嵌套模型视图
【发布时间】:2020-09-04 00:04:05
【问题描述】:

我正在开发一个带有其余框架的 Django API,我想获取与父级相关的所有子类的数据以及父级数据。 我现在可以做到这一点的唯一方法是使用序列化程序中的< depth = 1 > 参数。但问题是,我得到每个孩子的父数据,我只想要一次。

我有两个嵌套模型,比如说:

class Shop(models.Model):
   name = models.Charfield(max_length=50)
   address = models.Charfield(max_length=200)
   
   def __str__(self):
        return self.name
        
class Product(models.Model)
  shop = models.ForeignKey('Shop', on_delete=models.CASCADE , related_name='product')
  name = models.Charfield(max_length=50)
  price = models.IntegerField(default=0)       

序列化器如下所示:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = [
            'shop',
            'pk',   
            'name',
            'price',
        ]

class ShopProductSerializer(serializers.ModelSerializer):
    product_set = ProductSerializer(many=True)
    class Meta:
        model = Shop
        fields = [
            'shop',
            'pk',   
            'name',
            'price',
            'product_set',
            
        ]

因此,如果我将 depth=1 添加到 ProductSerializer,我会得到重复的 Shop Data。 我已经看到通过创建像第二个这样的嵌套序列化程序来解决这个问题。

但是我该如何添加我的 API 视图来使用它呢?

现在看起来像这样:

class ProductListView(generics.ListAPIView):
    serializer_class    = ProductSerializer
    def get_queryset(self):
        shop  = self.kwargs['pk']
        products = Product.objects.filter(shop=shop)
        return products

我理想的 JSON 应该是这样的:

{
  'shop':{
    'name'    = 'abc',
    'address' = 'abc 123'
  },
  'products':{
    {
    ...product 1 data
    },
    {
    ...product 2 data
    }
  }
} 

【问题讨论】:

  • 不应该在product 中使用shop 字段吗?

标签: django api rest nested


【解决方案1】:

安装 drf-writable-nested https://pypi.org/project/drf-writable-nested/

from rest_framework import serializers
from drf_writable_nested.serializers import WritableNestedModelSerializer
   

class ShopSerializer(serializers.ModelSerializer):
    class Meta:
        model = Shop
        fields = [  
            'name',
            'address'
        ]

class ProductSerializer(WritableNestedModelSerializer):
    shop = ShopSerializer()
    class Meta:
        model = Product
        fields = [
            'pk',
            'shop'
            'name'
            'price'
            ]

        
      

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多