【问题标题】:django nested serializer and ViewSetdjango 嵌套序列化器和 ViewSet
【发布时间】:2020-12-01 09:48:12
【问题描述】:

我遇到了嵌套序列化程序和 ViewSet 的问题

我的模型是这样的,他们的关系很清楚

这个类之间有嵌套关系

class Sim(models.Model):
   name = models.CharField(max_length=255)
   subject = models.ManyToManyField(Subject)
   grade = models.ManyToManyField(Grade)

class Exercise(models.Model):
   name = models.CharField(max_length=255)
   sim = models.OneToOneField(Sim,related_name='sims', on_delete=models.CASCADE)

class Result(models.Model):
   is_example = models.BooleanField(null=False)
   exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, blank=True, null=True, 
       default=None)
class Parameter(models.Model):
    name = models.CharField(max_length=255)
    exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, blank=True, null=True, 
        default=None)

class ExerciseData(models.Model):
    value = models.CharField(max_length=255)
    parameter = models.ForeignKey(Parameter, on_delete=models.CASCADE, blank=True, 
        null=True, default=None)
    result = models.ForeignKey(Result, on_delete=models.CASCADE, blank=True, null=True, 
        default=None)
    

我想构建一个这样的练习序列化器

class ExerciseSerializer(serializers.ModelSerializer):
    parameters = ParameterSerializer(many=True, read_only=True)
    exercisedatas = ExerciseDataSerializer(many=True, read_only=True)
    sims = SimSerializer(many=True, read_only=True)

    class Meta:
       model = models.Exercise
       fields = ['name', 'id', 'parameters', 'exercisedatas','sims']

    extra_kwargs = {
        'id': {'read_only': True},
    }

class SimSerializer(serializers.ModelSerializer):
    grade = GradeSerializer(many=True, read_only=True)
    subject = SubjectSerializer(many=True, read_only=True)

    class Meta:
        model = models.Sim
        fields = ['name', 'subject', 'grade', 'id']

    extra_kwargs = {
        'id': {'read_only': True},
    }

class ParameterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Parameter
        fields = ['name', 'id']

    extra_kwargs = {
        'id': {'read_only': True},
    }

class ResultSerializer(serializers.ModelSerializer):
    class Meta:
        model = Result
        fields = ['is_example', 'id']

    extra_kwargs = {
        'id': {'read_only': True},
    }

class ExerciseDataSerializer(serializers.ModelSerializer):
    parameter_set = ParameterSerializer(many=True, read_only=True)
    result_set = ResultSerializer(many=True, read_only=True)

    class Meta:
       model = ExerciseData
       fields = ['value', 'id', 'parameter_set', 'result_set']

    extra_kwargs = {
        'id': {'read_only': True},
    }

我的视图集是这样创建的:

class ExerciseViewset(viewsets.ModelViewSet):
    serializer_class = serializers.ExerciseSerializer
    pagination_class = StandardResultsSetPagination
    queryset = models.Exercise.objects.all()

    def filter_queryset(self, queryset):
        queryset = self.get_queryset()
        queryset = play_filtering_form(queryset, self.request.query_params)
        return queryset

我没有收到想要的输出

输出

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "name": "تمرین",
            "id": 1
        }
]

}

我没有收到参数和exercisedatas和sims这三项

【问题讨论】:

  • 我不是很明白你的问题,你是在尝试做所有的练习吗?
  • @Omar 是的,我正在尝试做所有的练习

标签: django django-models django-rest-framework django-serializer


【解决方案1】:

假设它们是正确的,我没有检查您的模型和序列化程序代码,但在您的视图集中,您可以通过使用通用视图来使用更简单的方法。

试试下面的视图类:

class ExerciseViewset(generics.ListAPIView):
    # form its name, ListAPIView do one action which is GET for list of results
    serializer_class = serializers.ExerciseSerializer
    pagination_class = StandardResultsSetPagination
    queryset = models.Exercise.objects.all()

如果您想自定义查询结果,可以像这样覆盖 get_queryset 方法:

def get_queryset(self):
    # you can use self.queryset or models.Exercise.objects.filter(any filter)
    return self.queryset.filter(some filtering)

关于通用视图的快速总结:

generics.ListAPIView:允许 GET 仅用于列出许多结果

generics.RetrieveAPIView:仅允许 GET,用于使用 lookup_field 检索特定结果,默认情况下:pk(例如在您的 urls.py 中:executive//)

generics.CreateAPIView:仅允许 POST

generics.UpdateAPIView:仅允许 PUT/Patch

generics.DestroyAPIView:只允许删除

有很多很棒的组合,例如:generics.ListCreateAPIView (POST, GET), generics.RetrieveUpdateAPIView (GET, PUT/PATCH)...

文档链接: DRF generic views

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 2017-07-12
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2018-06-23
    相关资源
    最近更新 更多