我正在做一个大学项目,要求我使用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方法?
答案 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')
你很好。