Миксин DRF использует метод создания менеджера моделей, но не метод обновления
# models.py
class HelloManager(models.Manager):
'''
On create, set date_created and last_modified to the same values
On update, set last_modified to current time
'''
def create(self, *args, **kwargs):
current_time = datetime.now()
kwargs.setdefault('date_created', current_time)
kwargs.setdefault('last_modified', current_time)
return super().create(*args, **kwargs)
def update(self, *args, **kwargs):
kwargs['last_modified'] = datetime.now()
return super().update(*args, **kwargs)
Функция CreateModelMixin
работает нормально, но UpdateModelMixin
не вызывает метод обновления моего менеджера.
Я просмотрел реализацию DRF и обнаружил, что UpdateModelMixin вызывает serializer.save()
, который вызывает либо update
, либо create
, но здесь я заблудился.
Я попробовал просто напрямую переопределить perform_create
следующим образом:
# views.py
class HelloDetailView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
generics.GenericAPIView):
queryset = HelloModel.objects.all()
lookup_field = 'id'
def get_serializer_class(self):
if self.request.method == 'POST':
return HelloWriteSerializer
return HelloReadSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def perform_update(self, serializer):
HelloModel.objects.update(**serializer.validated_data)
Но проблема в том, что UpdateModelMixin
теперь возвращает старые данные. Как лучше поступить в этом случае?
Я думаю, что вы не передаете PK или ID в методе обновления следующим образом:
def perform_update(self, serializer):
instance = serializer.instance
HelloModel.objects.update(pk=instance.pk, serializer.validated_data)
Необходимо найти способ перезагрузки экземпляра в сериализатор после обновления.
def perform_update(self, serializer):
HelloModel.objects.update(**serializer.validated_data)
# reload instance into serializer after update
updated_instance = HelloModel.objects.get(pk=serializer.instance.pk)
serializer.instance = updated_instance