首页 > 解决方案 > 禁止直接分配到相关集的反面。我添加了一个属性并收到此错误

问题描述

我不明白为什么会出现此错误,我只是在 Rest 模型中添加了一个新的外键属性,但它不起作用:

错误

TypeError: Direct assignment to the reverse side of a related set is prohibited. Use exercises.set() instead.

我不知道名称“rest”是否导致我已经更改了属性的名称,但我无法使其工作。

模型.py

class Routine(models.Model):
    name = models.CharField(max_length=30)
    creation_date = models.DateField(auto_now_add=True)
class Workout(models.Model):
    name = models.CharField(max_length=30)
    creation_date = models.DateField(auto_now_add=True)
    routine = models.ForeignKey(Routine, related_name='workouts', on_delete=models.CASCADE)
class Exercise(models.Model):
    index = models.IntegerField()
    video_url = models.URLField(max_length=200)
    workout = models.ForeignKey(Workout, related_name='exercises', on_delete=models.CASCADE)
class Rest(models.Model):
    index = models.IntegerField()
    duration = models.IntegerField()
    workout = models.ForeignKey(Workout, related_name='rests', on_delete=models.CASCADE)
    routine = models.ForeignKey(Routine, related_name='rests', on_delete=models.CASCADE)

序列化程序.py

class WorkoutSerializer(serializers.ModelSerializer):
    exercises = ExerciseSerializer(many=True)
    rests = RestSerializer(many=True)

    class Meta:
        model = Workout
        fields = ['id', 'name', 'creation_date', 'exercises', 'rests']

    def create(self, validated_data):
        exercises_data = validated_data.pop('exercises')
        rests_data = validated_data.pop('rests')
        workout = Workout.objects.create(**validated_data)
        
        for exercise_data in exercises_data:
            Exercise.objects.create(workout=workout, **exercise_data)

        for rest_data in rests_data:
            Rest.objects.create(workout=workout, **rest_data)

        return workout

class RoutineSerializer(serializers.ModelSerializer):
    workouts = WorkoutSerializer(many=True)
    rests = RestSerializer(many=True)

    class Meta:
        model = Routine
        fields = ['id', 'name', 'creation_date', 'workouts', 'rests']

    def create(self, validated_data):
        workouts_data = validated_data.pop('workouts')
        rests_data = validated_data.pop('rests')
        
        routine = Routine.objects.create(**validated_data)

        for workout_data in workouts_data:
            Workout.objects.create(routine=routine, **workout_data)

        for rest_data in rests_data:
            Rest.objects.create(routine=routine, **rest_data)

        return routine

标签: pythondjangodjango-rest-framework

解决方案


推荐阅读