Как и @DanEEStart, DjangoRestFramework не имеет простого способа расширить значение «все» для полей, потому что методы get_field_names
, похоже, предназначены для для работы .
Но, к счастью, вы можете переопределить этот метод, чтобы обеспечить простой способ включения всех полей и отношений без перечисления нескольких полей.
Я переопределяю этот метод следующим образом:
class ToppingSerializer(serializers.ModelSerializer):
class Meta:
model = Topping
fields = '__all__'
extra_fields = ['pizzas']
def get_field_names(self, declared_fields, info):
expanded_fields = super(ToppingSerializer, self).get_field_names(declared_fields, info)
if getattr(self.Meta, 'extra_fields', None):
return expanded_fields + self.Meta.extra_fields
else:
return expanded_fields
Обратите внимание, что этот метод только изменяет поведение этого сериализатора, а атрибут extra_fields
работает только с этим классом сериализатора.
Если у вас есть тонна сериализатора, подобная этому, вы можете создать промежуточный класс для включения этого метода get_fields_names
в одном месте и повторного использования много раз. Некоторым это нравится:
class CustomSerializer(serializers.HyperlinkedModelSerializer):
def get_field_names(self, declared_fields, info):
expanded_fields = super(CustomSerializer, self).get_field_names(declared_fields, info)
if getattr(self.Meta, 'extra_fields', None):
return expanded_fields + self.Meta.extra_fields
else:
return expanded_fields
class ToppingSerializer(CustomSerializer):
class Meta:
model = Topping
fields = '__all__'
extra_fields = ['pizzas']
class AnotherSerializer(CustomSerializer):
class Meta:
model = Post
fields = '__all__'
extra_fields = ['comments']
Вы можете попробовать это решение
Сначала откройте sdkmanager.bat
в любом текстовом редакторе
Затем найдите эту строку
%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS%
И измените ее на эту строку [116 ]
%JAVA_EXE%" %DEFAULT_JVM_OPTS% --add-modules java.xml.bind %JAVA_OPTS% %SDKMANAGER_OPTS%
Надеюсь, это решит твою проблему.