Django rest не показывает ошибку списка в соответствующем индексе
У меня есть сервис, который принимает список с датами. Я намеренно отправляю список, который имеет ошибку с индексом 1. Ошибка должна быть возвращена как массив, который имеет 1. индекс, но он возвращается как показано ниже.
Поле dates является RelatedField и many=True
post_data=["2020-01-01","a"]
Ожидаемый ответ на ошибку;
'dates': {
'1': {
['Incorrect format. Expected iso format.']
}
}
Реальный ответ на ошибку;
'dates': ['Incorrect format. Expected iso format.']
models.py
class EventModel(models.Model):
title = models.CharField(max_length=100, null=False, blank=False)
address = models.CharField(max_length=255, null=False, blank=False)
def __str__(self):
return self.title
class EventDateTimeModel(models.Model):
date_time = models.DateTimeField(null=False, blank=False)
event = models.ForeignKey('EventModel', on_delete=models.CASCADE, related_name='dates')
def __str__(self):
return self.date_time.isoformat()
serialziers.py
class DateTimeReleatedField(serializers.RelatedField):
default_error_messages = {
'incorrect_type': 'Incorrect format. Expected iso format',
}
def to_internal_value(self, data):
try:
if not isinstance(data, str):
raise TypeError
return datetime.fromisoformat(data) # str to datetime object in post data
except (TypeError, ValueError):
self.fail('incorrect_type', data_type=type(data).__name__)
def to_representation(self, value):
return str(value) # using "EventDateTimeModel" model's __str__() method
class EventSerializer(serializers.ModelSerializer):
dates = DateTimeReleatedField(many=True, queryset=EventDateTimeModel.objects.all(), required=True)
class Meta:
model = EventModel
fields = ['id', 'title', 'address', 'dates']
def create(self, validated_data):
dates = validated_data.pop('dates', None)
with transaction.atomic():
instance = super().create(validated_data)
if dates:
for date_time in dates:
EventDateTimeModel.objects.create(date_time=date_time, event=instance)
return instance
def update(self, instance, validated_data):
dates = validated_data.pop('dates', None)
with transaction.atomic():
instance = super().update(instance, validated_data)
if dates:
for date_time in dates:
EventDateTimeModel.objects.update_or_create(date_time=date_time, event=instance)
return instance