У меня есть таблица с большим двоичным объектом, и я хотел бы исключить ее из вызова sql в базу данных, если это не требуется специально.Из коробки django включает все в набор запросов.До сих пор я нашел единственный способ ограничить поле - добавить функцию в представление get_queryset ()
def filter_queryset_fields(request, query_model):
fields = request.query_params.get('fields')
if fields:
fields = fields.split(',')
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set([f.name for f in query_model._meta.get_fields()])
values = []
for field_name in existing & allowed:
values.append(field_name)
queryset = query_model.objects.values(*values)
else:
queryset = query_model.objects.all()
return queryset
class TestViewSet(DynamicFieldsMixin, viewsets.ReadOnlyModelViewSet):
queryset = models.TestData.objects.all()
serializer_class = serializers.TestSerializer
filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
filter_fields = ('id', 'frame_id', 'data_type')
def get_queryset(self):
return filter_queryset_fields(self.request, models.TestData)
и смешать с сериализатором, чтобы ограничить поля, которые он проверяет
class DynamicFieldsMixin(object):
def __init__(self, *args, **kwargs):
super(DynamicFieldsMixin, self).__init__(*args, **kwargs)
if "request" in self.context and self.context['request'] is not None:
fields = self.context['request'].query_params.get('fields')
if fields:
fields = fields.split(',')
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)
class TestSerializer(DynamicFieldsMixin, rest_serializers.ModelSerializer):
class Meta:
model = models.TestData
fields = '__all__'
это похоже на большой код для того, что он делает.Есть ли более простой способ?