我正在使用Django Rest API Framework,我想使用Angular js为单个项目上传多个图像。
这是我的模特:
class Project(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
owner = models.ForeignKey(User)
number_of_photos = models.IntegerField()
class Photo(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
images = models.ImageField(upload_to='photos/', max_length=254)
project = models.ForeignKey(Project)
我有这个序列化器:
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = ('id', 'created', 'number_of_photos', 'owner')
def create(self, validated_data):
project = Project.objects.create(**validated_data)
return project
class UploadSerializer(serializers.ModelSerializer):
project = ProjectSerializer(many=True, read_only=True)
class Meta:
model = Photo
fields = ('url', 'created', 'images', 'project')
在我的视图中,我在viewsets.ModelViewSet
中找到了这个serializer = UploadSerializer(data=photo_array, many=True, context={'request': request})
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
变量 photo_array 包含:
[{' project&#39 ;: u' 1',' images':{u' name':u' test-image。 png',u' lastModifiedDate&#39 ;: u' 2015-04-22T08:51:11.000Z',u' webkitRelativePath':u'',你' lastModified':1429692671000,你'输入':你'图片/ png',你'尺寸':43152}},{'项目& #39;:你' 1','图片':{u' name&#39 ;: u' test.png',u' lastModifiedDate' ;:u' 2015-04-08T08:35:17.000Z',u' webkitRelativePath':u'',u' lastModified':1428482117000,u& #39;输入':你' image / png',u' size':127433}}]
但它给了我一个错误' dict'对象没有属性' pk'
我的photo_array变量是否会导致此问题?
答案 0 :(得分:1)
如果没有追溯,我只能对这个问题实际上是一个有根据的猜测。
您正在使用标准ModelSerializer
,并且您允许Django REST框架为您生成字段。您可以通过打印repr(UploadSerializer())
的输出来内省生成的字段,但它们看起来应该是这样的:
class UploadSerializer(ModelSerializer):
url = HyperlinkedIdentityField()
created = DateTimeField()
images = ImageField()
project = ProjectSerializer(many=True, read_only=True)
class Meta:
model = Photo
fields = ('url', 'created', 'images', 'project')
使用这些字段,从序列化程序传回的典型字典应该类似于
{
"id": 1,
"url": "http://localhost:8000/api/photos/1/",
"created": "2015-04-22T08:51:11.000Z",
"images": "http://localhost:8000/media/test-image.png",
"project": {
"id": 1,
"created": "2015-04-22T08:51:11.000Z",
"number_of_photos": 1,
"owner": 1
}
}
您会注意到这与您传入的内容完全不同。您传入的数据与类似于
的序列化程序相匹配class UploadSerializer(ModelSerializer):
url = HyperlinkedIdentityField()
created = DateTimeField()
images = SomeCustomImageField()
project = PrimaryKeyRelatedField()
class Meta:
model = Photo
fields = ('url', 'created', 'images', 'project')
这样可以回答你的第二个问题
我的photo_array变量是否导致此问题?
最有可能。现在,我实际上并不知道你的问题是什么。 听起来像你将字典传递给PrimaryKeyRelatedField
,但你的序列化程序实际上并不匹配。
答案 1 :(得分:0)
我认为你应该用id字段
更新你的UploadSerializer