【问题标题】:How to fetch parent child hierarchy using django rest-framework如何使用 django rest-framework 获取父子层次结构
【发布时间】:2020-04-01 16:53:49
【问题描述】:

我是 Django 休息框架的新手。我正在编写一个 API 来获取父子层次结构中的详细信息。以下是我的代码;

models.py

class ConfigAttributes(models.Model):
    attr_set_name = models.CharField(max_length=32)
    product_type = models.CharField(max_length=32)


class ProductInfo(models.Model):
    config_attr = models.ForeignKey(ConfigAttributes, on_delete=models.CASCADE)
    product_name = models.CharField(max_length=32)


class AttributeDetails(models.Model):
    product_info = models.ForeignKey(ProductInfo, on_delete=models.CASCADE)
    attribute_name = models.CharField(max_length=32)

serializers.py

class ConfigAttributesSerializer(serializers.ModelSerializer):
    class Meta:
        model = ConfigAttributes
        fields = ['id', 'attr_set_name', 'product_type']


class ProductInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductInfo
        fields = ['id', 'product_name', 'config_attr_id']


class AttributeDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = AttributeDetails
        fields = ['id', 'attribute_name', 'product_info_id']

views.py

class ConfigAttributesViewSet(viewsets.ModelViewSet):
    queryset = ConfigAttributes.objects.all()
    serializer_class = ConfigAttributesSerializer


class ProductInfoViewSet(viewsets.ModelViewSet):
    queryset = ProductInfo.objects.all()
    serializer_class = ProductInfoSerializer


class AttributeDetailsViewSet(viewsets.ModelViewSet):
    queryset = AttributeDetails.objects.all()
    serializer_class = AttributeDetailsSerializer

app/urls.py

router = routers.DefaultRouter()
router.register('config', ConfigAttributesViewSet)
router.register('product', ProductInfoViewSet)
router.register('attr', AttributeDetailsViewSet)


urlpatterns = [
    path('', include(router.urls)),
]

当我调用 API 时,我需要的层次结构和输出是;

[
  {
    "attr_set_name" : "abc",
    "product_type" : "efg",
    "product_info" : {
                      "product_name" : "hij",
                      "attribute_details" : {
                                              "attribute_name" : "klm"
                                             }
                      }
  }
]

需要在文件中进行哪些更改才能在层次结构中获得上述输出(我正在使用 Postman 检查我的 API)。感谢您的帮助。

【问题讨论】:

    标签: django python-3.x django-models django-rest-framework django-views


    【解决方案1】:

    您可以nest your serializers。为了匹配您的通用 API 层次结构,这是尽可能接近的。不幸的是,关系字段将是列表。

    class AttributeDetailsSerializer(serializers.ModelSerializer):
        class Meta:
            model = AttributeDetails
            fields = ['id', 'attribute_name', 'product_info_id']
    
    class ProductInfoSerializer(serializers.ModelSerializer):
        attribute_details = AttributeDetailsSerializer(many=True)
    
        class Meta:
            model = ProductInfo
            fields = ['id', 'product_name', 'config_attr_id', 'attribute_details']
    
    class ConfigAttributesSerializer(serializers.ModelSerializer):
        product_infos = ProductInfoSerializer(many=True)
    
        class Meta:
            model = ConfigAttributes
            fields = ['id', 'attr_set_name', 'product_type', 'product_infos']
    

    如果你从 AttributeDetails 实例开始,你可以获得特定的父元素:

    class ConfigAttributesSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = ConfigAttributes
            fields = ['id', 'attr_set_name', 'product_type',]
    
    
    class ProductInfoSerializer(serializers.ModelSerializer):
        config_attribute = ConfigAttributesSerializer(many=False)
    
        class Meta:
            model = ProductInfo
            fields = ['id', 'product_name', 'config_attr_id', 'config_attribute']
    
    
    class AttributeDetailsSerializer(serializers.ModelSerializer):
        product_info = ProductInfoSerializer(many=False)
        class Meta:
            model = AttributeDetails
            fields = ['id', 'attribute_name', 'product_info_id', 'product_info']
    

    【讨论】:

      猜你喜欢
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多