Сериализатор Django не проверяет и не сохраняет данные
Я пытаюсь сохранить данные в базе данных, это работает для большинства моих моделей, но для нескольких моделей я не уверен, почему, но django не сериализует данные. Надеюсь, кто-нибудь сможет указать, где я могу ошибаться. Вот мой код
Django Models
class UserModel(AbstractUser):
uuid = models.UUIDField(default=uuid.uuid4, editable=False)
class UserWorkPresenceModel(models.Model):
user = models.ForeignKey("UserModel", on_delete=models.CASCADE, related_name="workpresence")
is_active = models.BooleanField(default=False)
check_in = models.DateTimeField(blank=False)
check_out = models.DateTimeField(blank=True, null=True)
work_break = []
class UserWorkBreakModel(models.Model):
work_presence = models.ForeignKey("UserWorkPresenceModel", on_delete=models.CASCADE, related_name="work_break")
start_break = models.DateTimeField(blank=True)
end_break = models.DateTimeField(blank=True, null=True)
is_current_break = models.BooleanField(default=False)
Сериализатор:
class UserTakeBreakSerializer(serializers.Serializer):
class Meta:
model = UserWorkBreakModel
# fields = ("start_break", "end_break")
fields = '__all__'
API View
class UserStartWorkBreakView(APIView):
def post(self, request, id):
try:
user = UserModel.objects.get(uuid=id)
except:
return Response({'message': 'User not found'}, status=HTTP_400_BAD_REQUEST)
try:
work_presence = UserWorkPresenceModel.objects.get(user=user, is_active=True)
except UserWorkPresenceModel.DoesNotExist:
return Response({'message': 'User work presence not found'}, status=HTTP_400_BAD_REQUEST)
currently_onbreak = UserWorkBreakModel.objects.filter(work_presence=work_presence, is_current_break=True)
if currently_onbreak.exists():
return Response({'message': 'User already working'}, status=HTTP_400_BAD_REQUEST)
serializer = UserTakeBreakSerializer(data=request.data)
print(serializer)
if serializer.is_valid():
print(f'validated_data: {serializer.validated_data}')
user.workpresence_status = UserWorkPresenceStatus.ON_BREAK
serializer.validated_data['is_current_break'] = True
serializer.save(work_presence=work_presence)
user.save()
print(f'serializer.data: {serializer.data}')
return Response(serializer.data, status=HTTP_201_CREATED)
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
Я не получаю никакой ошибки, просто пустой словарь, вот результат моих команд печати:
UserTakeBreakSerializer(data={'start_break': '2024-05-10 15:05:52.829867'}):
validated_data: {}
serializer.data: {}
Возможно, вам покажется смешным, но я реализовал ту же логику для UserWorkPresenceModel и она работает нормально, я могу делать как создание, так и обновление для UserWorkPresenceModel. И дело не только в этом, у меня такая же проблема с другой моделью, одна работает, а в другой похожей модели та же логика не работает.
Спасибо за помощь
Используйте ModelSerializer
[drf-doc]. Для простого сериализатора вам придется самостоятельно написать шаблонный код:
class UserTakeBreakSerializer(serializers.ModelSerializer): class Meta: model = UserWorkBreakModel fields = '__all__'
По сути, произошло то, что вы определили пустой сериализатор: сериализатор с без полей и без логики сохранения. Сериализатор ModelSerializer
, напротив, смотрит на Meta
и затем создает поля и соответствующую логику для этой модели.