Миксин 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
Вернуться на верх