我有两个模型Task
和TaskImage
,它们是属于Task
对象的图像集合。
我的目标是能够向我的Task
对象添加多张图像,但我只能使用两个模型来实现。目前,当我添加图像时,它不允许我上传它们并保存新的对象。
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
serializers.py
class TaskImageSerializer(serializers.ModelSerializer):
class Meta:
model = TaskImage
fields = ('image',)
class TaskSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
images = TaskImageSerializer(source='image_set', many=True, read_only=True)
class Meta:
model = Task
fields = '__all__'
def create(self, validated_data):
images_data = validated_data.pop('images')
task = Task.objects.create(**validated_data)
for image_data in images_data:
TaskImage.objects.create(task=task, **image_data)
return task
models.py
class Task(models.Model):
title = models.CharField(max_length=100, blank=False)
user = models.ForeignKey(User)
def save(self, *args, **kwargs):
super(Task, self).save(*args, **kwargs)
class TaskImage(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE)
image = models.FileField(blank=True)
然而,当我进行POST请求时:
我得到了以下的回溯信息:
在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/core/handlers/exception.py"的第41行,发生异常;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/core/handlers/base.py"的第187行,处理异常;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/core/handlers/base.py"的第185行,对请求进行处理;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/django/views/decorators/csrf.py"的第58行,装饰器包装视图函数;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/viewsets.py"的第95行,调用视图;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/views.py"的第494行,处理异常;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/views.py"的第454行,抛出未捕获的异常;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/views.py"的第491行,处理请求;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/mixins.py"的第21行,创建对象;在"/Users/gr/Desktop/PycharmProjects/godo/api/views.py"的第152行,执行创建操作;在"/Applications/Anaconda/anaconda/envs/godo/lib/python3.6/site-packages/rest_framework/serializers.py"的第214行,保存对象;在"/Users/gr/Desktop/PycharmProjects/godo/api/serializers.py"的第67行,获取images数据时发生KeyError异常。
serializers
中你使用了source=taskimage_set
,我不确定为什么会这样?更合理的应该是task_image_set
或者更一般的model-field_set
,这只是用于一对多关系的惯例吗? - GRSTaskImage.objects.create(task=task, image=image_data)
)时,是否应该使用序列化程序进行创建?如果不这样做,我会认为您正在绕过验证阶段,并且未经验证即保存对象。 - geekscrapserializer.ImageField()
字段进行验证的。 - JPG