Если вы не хотите создавать другой сериализатор, вы можете разрешить динамическое изменение его полей, как показано в примере ниже.
https://www.django -rest-framework.org / api-guide / serializers/ # пример
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed.
"""
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)
# Instantiate the superclass normally
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
Теперь вы можете передать подмножество полей, если пользователь не аутентифицирован
if request.user.is_authenticated():
RequirementsSerializer(instance)
else:
RequirementsSerializer(instance, fields=('comments_set',)) # excluding relatedfiles_set
Если вы не создаете экземпляр Serializer явно, вы можете переопределитьметод get_serializer
представления, который должен вернуть экземпляр Serializer и поместить туда условное выражение.
def get_serializer(self, *args, **kwargs):
"""
Return the serializer instance that should be used for validating and
deserializing input, and for serializing output.
"""
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
if not self.request.user.is_authenticated():
kwargs['fields'] = ('comments_set',)
return serializer_class(*args, **kwargs)