Django DRF не может десериализовать json
Я столкнулся с очень странной проблемой с django drf. Представление ниже не десериализует event_time
в методе post().
class EventListCreateView(generics.ListCreateAPIView):
class EventSerializer(serializers.ModelSerializer):
school_id = serializers.IntegerField(read_only=True)
class_number = serializers.CharField(source='class.universal_number', read_only=True)
class_id = serializers.IntegerField(write_only=True)
class Meta:
model = Event
fields = ('pk', 'event', 'school_id', 'class_number', 'class_id', 'event_time',)
serializer_class = EventSerializer
filterset_class = EventFilterSet
ordering_fields = ['event_time']
def get_queryset(self):
return (
Event.objects.select_related('class')
.annotate(school_id=F('class__school'))
.order_by('-pk')
)
Работает только после того, как я явно упомяну event_time
в сериализаторе:
class EventListCreateView(generics.ListCreateAPIView):
class EventSerializer(serializers.ModelSerializer):
school_id = serializers.IntegerField(read_only=True)
class_number = serializers.CharField(source='class.universal_number', read_only=True)
class_id = serializers.IntegerField(write_only=True)
event_time = serializers.DateTimeField()
class Meta:
model = Event
fields = ('pk', 'event', 'school_id', 'class_number', 'class_id', 'event_time',)
serializer_class = EventSerializer
filterset_class = EventFilterSet
ordering_fields = ['event_time']
def get_queryset(self):
return (
Event.objects.select_related('event_class')
.annotate(school_id=F('class__school'))
.order_by('-pk')
)
Модель :
class Event(models.Model):
event_class = models.ForeignKey(Class, on_delete=models.DO_NOTHING)
event = models.CharField(choices=EventNameEnum.choices, max_length=50, db_index=True)
event_time = models.DateTimeField(editable=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'Event id: {self.pk} , Device id: {self.event_class.pk}'
Что не имеет смысла, чтобы быть правильным подходом. Любое предложение о том, как решить эту проблему, будет оценено по достоинству.
Я нашел причину проблемы.
Она возникла из-за editable=False
в объявлении event_time в модели:
event_time = models.DateTimeField(editable=False)
Когда поле объявлено как не редактируемое, оно должно быть явно объявлено в сериализаторе, чтобы быть включенным в десериализацию.