Как получить родительскую дочернюю иерархию, используя django rest-framework - PullRequest
0 голосов
/ 01 апреля 2020

Я новичок в Django rest-framework. Я пишу 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). Спасибо вам за помощь.

1 Ответ

2 голосов
/ 01 апреля 2020

Вы можете вкладывать свои сериализаторы . Чтобы соответствовать вашей общей иерархии 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']

Вы можете получить указанные c родительские элементы, если начнете с экземпляра 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']
...