'字典'对象没有属性' pk' Django Rest API框架

时间:2015-05-05 09:24:07

标签: python django angularjs rest django-rest-framework

我正在使用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变量是否会导致此问题?

2 个答案:

答案 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