Добавление аргумента в сериализатор
Делаю Канбан-доску и со страницы прилетают 2 аргумента по PATCH-запросу:
- pk задачи
- boardName - наименование доски на которую переместили задачу.
Поля boardName у меня в моделях нет, но есть аналог Status. Мне нужно обработать прилетевшие со страницы данные о задачи и в сериализатор отправить pk и дату (поле DateTime_schedule) чтобы обновить поле DateTime_schedule.
Пытался переопределить метод update в KanbanEProposalSerializer, но отладить его не могу, точка останова его не видит.
Смотрел много примеров и вот что написал. Подскажите мне пожалуйста: как обновить поле DateTime_schedule датой полученной из куска кода в partial_update().
serializers.py
class KanbanEProposalSerializer(serializers.ModelSerializer):
class Meta:
model = eproposals
fields = '__all__'
#('id', 'NumObject', 'AddressObject', 'Client_words', 'FaultAppearance', 'DescriptionWorks', # 'DateTime_schedule', 'DateTime_work', 'Status')
def update(self, instance, validated_data):
print('this-here')
task_data = eproposals.objects.get(pk=instance.id)
eproposals.objects.filter(pk=instance.id).update(**validated_data)
return task_data
views.py
class KanbanEProposalViewSet(viewsets.ModelViewSet):
serializer_class = KanbanEProposalSerializer
def get_queryset(self):
....
def partial_update(self, request, *args, **kwargs):
request.data['DateTime_schedule'] = '2022-12-27'
kwargs['partial'] = True
pk = self.kwargs.get("pk")
date_schedule = None
board_name = request.data.get('boardName', None)
task_data = eproposals.objects.get(pk=pk)
currdate = datetime.now().date()
if task_data.Status.Name == 'Принята' and board_name not in ['Завершено', 'Исполнено']:
if board_name == 'Сегодня':
date_schedule = currdate
elif board_name == 'Завтра':
date_schedule = currdate + timedelta(days=1)
elif board_name == 'Понедельник':
delta = 7 - currdate.isoweekday() + 1
date_schedule = currdate + timedelta(days=delta)
serialized = KanbanEProposalSerializer(request.user, data=request.data, partial=True)
return Response(status=status.HTTP_202_ACCEPTED)
Ответы (1 шт):
Автор решения: Андрей Бондаренко
→ Ссылка
Сам задал и сам о нашел решение на основе другой статьи на данном сайте.
- Коментим def partial_update.
- Переносим код определения даты в update в serialiser.
- Добавляем Validate_data({'DateTime_schedule': date_schedule}) return super().update(instance, validated_data) И всё работает.