Ошибка 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.

Вернуться на верх