Ошибка django "StringRelatedField.to_internal_value() должна быть реализована для поля "
У меня есть модель для "спортзала", и модель для "тренировки":
class Gym(models.Model):
name = models.CharField(max_length=255)
address = models.CharField(max_length=255)
def __str__(self):
return self.name
class Workout(models.Model):
gym = models.ForeignKey(Gym, on_delete=models.CASCADE)
time = models.DateTimeField()
Я также покажу 'WorkoutSerializer':
class WorkoutSerializer(serializers.ModelSerializer):
gym = serializers.StringRelatedField()
class Meta:
model = Workout
fields = ['gym','time']
Как вы видите, gym представлен в json тренировки как строка поля 'name'.
вот вид для тренировки:
@api_view(['GET','POST'])
def workout_list(request):
if request.method == 'GET':
queryset = Workout.objects.select_related('gym').all()
serializer = WorkoutSerializer(queryset, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = WorkoutSerializer(data=request.data)
serializer.is_valid(raise_exception=True) # rasis 400 bad request if needed
serializer.save()
return Response('ok')
когда я пытаюсь проверить POST запрос с (я хочу использовать str представление спортзала в POST также):
{ "спортзал": "спортзал 2", "деятельность": "Юга", "время": "2022-03-07T06:00:00Z", "participants": [ "Анна Боинг" ] }
Я получаю ошибку:
StringRelatedField.to_internal_value() must be implemented for field
Есть идеи, почему, и что я могу сделать, чтобы исправить это?
StringRelatedField - это поле только для чтения. Если вы хотите сделать поле gym доступным для записи, вы можете использовать вместо него SlugRelatedField. Обратите внимание, что поле slug соответствует полю модели с помощью unique=True.
Я думаю, что StringRelatedField не будет работать для создания объекта,
Кроме того, Gym требует адрес и имя, а вы передаете только имя.
Для этого можно использовать SlugRelatedField.