Невозможно получить вложенные данные модели с помощью ListAPI View Django Rest Framework - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть приложение django rest framework, которое создает структуру проектов на основе моделей.Проект может иметь несколько разделов, то есть раздел 1, раздел 2 и т. Д., И каждый раздел может иметь только одну информацию о разделе и вопрос о разделе.Чтобы не создавать одинаковые столбцы в разных таблицах разделов, я создал отдельную модель sectionInfo и sectionQuestion, которая связана с проектами через внешний ключ.SectionQuestion и section1, section2 связаны с sectionInfo с помощью onetoonefield.

Подвох заключается в том, что я хочу получить подробности в формате, определенном в сериализаторе проекта, где section1 и section2 будут содержать детали проекта, и мне нужна информация и вопросдетали как часть section1, section2 в виде данных json.

Мои section1, section2 и раздел section связаны с моделью проекта через модель sectionInfo, и я хочу вывод в обратном порядке, как показано ниже: -

{
            "p_name": "test2",
            "p_name_full": "test2-2018-09-20",
            "section1": {
                         .......
                         "sectionInfo":{.........}
                         "sectionQues":{.........}
                        },
            "section2": {
                         .......
                         "sectionInfo":{.........}
                         "sectionQues":{.........}
                        }
}

views.py

class ProjectListAPIView(ListAPIView):            
    permission_classes = [AllowAny]
    serializer_class = ProjectSerializer

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

    def list(self, request):
        queryset = self.get_queryset()
        serializer = self.get_serializer(queryset, many=True)        
        if not serializer.data:
            return Response({'code': 'empty'}, status=HTTP_200_OK)
        return Response({'code': 'retrieve_success', 'message': serializer.data}, status=HTTP_200_OK)

models.py

class Projects(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    p_name = models.CharField(max_length=100)
    p_name_full = models.CharField(max_length=150)

class SectionInfo(models.Model):
    p_id = models.ForeignKey(Projects, 
        on_delete=models.CASCADE, related_name='sec_proj', db_column='p_id')
    s_name = models.CharField(max_length=200)
    s_type = models.CharField(max_length=200, db_column='type')
    s_length = models.IntegerField(null=True, blank=True)

class SectionQuestion(models.Model):
    info_id = models.OneToOneField('rsa.SectionInfo', 
        on_delete=models.CASCADE, related_name='sec_ques', db_column='info_id')
    s_q1r = models.TextField(max_length=10000,null=True, blank=True)
    s_q2r = models.TextField(max_length=10000,null=True, blank=True)

class Section1(models.Model):
    info_id = models.OneToOneField('rsa.SectionInfo', 
        on_delete=models.CASCADE, related_name='sec_1_info', db_column='info_id')
    s_cbRestrictionEnd_1 = models.IntegerField(null=True, blank=True)
    s_cbCone_1 = models.IntegerField(null=True, blank=True)
    s_cbWorkTraff_1 = models.IntegerField(null=True, blank=True)
    s_cbReflector_1 = models.IntegerField(null=True, blank=True)

class Section2(models.Model):
    info_id = models.OneToOneField('rsa.SectionInfo', 
        on_delete=models.CASCADE, related_name='sec_2_info', db_column='info_id')
    s_cbRestrictionEnd_1 = models.IntegerField(null=True, blank=True)
    s_cbReflector_1 = models.IntegerField(null=True, blank=True)
    s_cbmReflector_1 = models.IntegerField(null=True, blank=True)
    s_cbDiversionRight_1 = models.IntegerField(null=True, blank=True)

serializers.py

class ProjectSerializer(ModelSerializer):
    sec_1 = Section1Serializer(many=True, required=False, read_only=False)
    sec_2 = Section2Serializer(many=True, required=False, read_only=False)

    class Meta:
        depth = 2
        model = Projects
        fields = [
            'sec_1',
            'sec_2',
        ]



class SectionInfoSerializer(ModelSerializer):

    class Meta:
        depth = 2
        model = SectionInfo
        fields = [
            's_name',
            's_type',
            's_length',
        ]

class SectionQuestionSerializer(ModelSerializer):
    class Meta:
        model = SectionQuestion
        fields = [
            's_q1r',
            's_q2r',


class Section1Serializer(ModelSerializer):
    sec_info = SectionInfoSerializer(required=False)
    sec_ques = SectionQuestionSerializer(required=False)

    class Meta:
        model = Section1
        fields = [
            'sec_info',
            'sec_ques',
            's_cbRestrictionEnd_1',
            's_cbCone_1',
            's_cbWorkTraff_1',
            's_cbReflector_1',
        ]


class Section2Serializer(ModelSerializer):
    sec_info = SectionInfoSerializer(required=False)
    sec_ques = SectionQuestionSerializer(required=False)

    class Meta:
        model = Section2
        fields = [
            'sec_info',
            'sec_ques',
            's_cbRestrictionEnd_1',
            's_cbReflector_1',
            's_cbmReflector_1',
            's_cbDiversionRight_1',
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...