python - 禁止直接分配到相关集的反面。我添加了一个属性并收到此错误
问题描述
我不明白为什么会出现此错误,我只是在 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
解决方案
推荐阅读
- c++ - 为什么 va_arg(va_list, type) 给我一个 C6285 警告?
- node.js - nodejs插件和wasm的比较
- node.js - Docker 是否有日志状态,例如错误、警告、信息?
- amazon-web-services - Amazon Personalize - 如何删除批量推理作业“正在创建”?
- typo3 - TYPO3 扩展:如何使与另一个扩展模型的关系成为可选?
- java - 如何使用@JsonIgnoreProperties 忽略 JSON 响应中的特殊子属性?
- html - EJS 标记功能失效
- c# - 加快 HttpWebRequest
- spring-boot - Spring Boot 2.3 中不推荐使用 OAuth2FeignRequestInterceptor 类
- vb.net - VB.NET 我们可以将列从 Datagridview 克隆到 DataTable