仅使用queryset方法时,DRF响应会返回所有字段

时间:2019-03-14 10:52:16

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

我正在做一个大学项目,要求我使用API​​作为后端来实现Web应用程序,并且我决定使用DRF来实现它,但是现在遇到了一些麻烦。

我试图覆盖“视图”中的list方法,以便在检索所有机场记录的列表时仅显示某些字段,但仍然在“响应”中返回所有字段。

型号:

app.naming = function() {
    return 'X_' + app.somethingA + '_' + app.somethingB + '_' + app.somethingC;
}

序列化器:

class Airport(models.Model):
    code = models.CharField(max_length=10)
    name = models.TextField()
    carriers = models.ManyToManyField(Carrier, related_name='airports')

    def __str__(self):
        return self.name

查看:

class AirportSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Airport
        fields = ('id', 'name', 'code', 'url', 'carriers')

响应:

class AirportView(viewsets.ModelViewSet):
    queryset = models.Airport.objects.all()
    serializer_class = AirportSerializer

    def list(self, request):
        airports = models.Airport.objects.only('id', 'name', 'code')
        data = AirportSerializer(airports, many=True, context={'request': request}).data
        return Response(data)

我该如何解决? 有没有更好的方法,我的意思是不使用QuerySet.only方法?

3 个答案:

答案 0 :(得分:2)

您应该定义一个单独的序列化器并将其返回。

答案 1 :(得分:0)

是序列化程序,它定义对象的序列化方式,而不是如何从数据库中筛选数据。当前,您在序列化程序中具有所有可用字段。如果您不希望在列出或检索项目时返回某些字段,则可以在序列化程序中将这些字段定义为 write_only ,如下所示:

class AirportSerializer(serializers.HyperlinkedModelSerializer):
    url = serializer.CharField(write_only=True)
    carriers = serializer.PrimaryKeyRelatedField(many=True, write_only=True)

    class Meta:
        model = models.Airport
        fields = ('id', 'name', 'code', 'url', 'carriers')

通过这种方式,返回数据时url和载波字段将不存在,但是在插入数据时将是必填字段。

答案 2 :(得分:-1)

只需将想要的字段放在您的序列化器中,如下所示:

class AirportSerializer(serializers.HyperlinkedModelSerializer):
  class Meta:
     model = models.Airport
    fields = ('id', 'name', 'code')

你很好。