Добавьте этот фрагмент кода в метод __init__
класса сериализатора, как предложено в документах DRF :
class TestSerializer(serializers.ModelSerializer):
user_req = UserSerializer(read_only=True)
user_tar = UserSerializer(read_only=True)
class Meta:
model = TestAssoc
fields = ("user_req", "user_tar")
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(TestSerializer, 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)
И так, когда вы вызываете сериализатор из views.py сделать это:
TestSerializer(queryset, fields=('user_req'))
В качестве альтернативы, вы можете определить класс
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
Теперь импортируйте этот класс, если вы определили его в каком-то другом файле, а затем наследуйте его, используя [1113 ]
class TestSerializer(DynamicFieldsModelSerializer):
Таким образом:
class TestSerializer(DynamicFieldsModelSerializer):
user_req = UserSerializer(read_only=True)
user_tar = UserSerializer(read_only=True)
class Meta:
model = TestAssoc
fields = ("user_req", "user_tar")
Теперь вы можете сделать
TestSerializer(queryset, fields=('user_req'))
Обновление
В представлениях. Возьмите пример ListAPIView
class DemoView(ListAPIView):
queryset = TestAssoc.objects.all()
def get(self, request):
try:
queryset = self.get_queryset()
data = TestSerializer(queryset, fields=('user_req')).data
return Response( {"data" : data } ,status=status.HTTP_200_OK)
except Exception as error:
return Response( { "error" : str(error) } , status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Управление транзакциями. Я знаю, что это каноническое использование АОП, но он действительно сияет, когда используется для этого.
И хотя у меня не было возможности использовать его в реальной ситуации, я считаю, что «советы вокруг» как НЕВЕРОЯТНО мощный, в частности, для того, чтобы упростить сложность кода за счет устранения необходимости во многих проверках на редкие условия.
Я согласен на Spring AOP.
AOSD (мы больше не говорим об АОП, я не совсем понимаю почему) действительно полезен для промежуточного программного обеспечения / сервис-ориентированной архитектуры, где у вас уже есть, по замыслу , некоторая модульность.
Я использовал его в этом контексте для услуг телефонии с некоторыми действительно ограниченными услугами биллинга.
Я также использовал его для создания своего рода модульного интерпретатора / компилятора, чтобы выполнить некоторый анализ вокруг некоторый код.
На мой взгляд, одна из проблем - это языки pointcut, которые иногда бывает сложно описать, где именно вы хотите применить свой совет. Другая проблема - композиция, я не знаю, решена ли она, но может быть трудно понять, когда вы заказываете свои советы ....
АОП является обычным явлением, за исключением того, что люди редко называют его АОП. Посмотрите на все места в программировании .NET, где используются атрибуты. Атрибуты - это, по сути, сквозное поведение, которое может применяться ко многим классам / методам / параметрам.
В последнее время платформа ASP.NET MVC приняла активное использование атрибутов для широкого спектра сквозных компонентов, таких как безопасность, привязка данных и обработка исключений.
По моему опыту, Spring AOP кажется довольно распространенным явлением.
Я думаю, что трудность в том, что люди просто не привыкли думать с точки зрения аспектов и вплетать код, даже во время компиляции может быть несколько пугающим, так как труднее увидеть, что на самом деле влияет на каждый метод, например, особенно, если вы используете смесь переплетения во время компиляции и времени выполнения.
Я использовал это в ситуации, когда у меня есть один контроллер, и я добавляю, например, сервлет или веб-сервис. Я также использовал его для абстрагирования базы данных, чтобы соединения с базой данных и запросы, оптимизированные для базы данных, могли быть включены в приложение.
В настоящее время я использую AOP через EntLib / Unity в производстве для:
см. http://www.agileatwork.com/unit-of-work-with-unity-and-aspnet-mvc/ для реализации шаблона единицы работы с АОП
[UnitOfWork]
public void Process(Job job)
{
...
}