У меня есть приложение 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',
]