【问题标题】:'dict' object has no attribute 'pk' Django Rest API Framework'dict' 对象没有属性 'pk' Django Rest API 框架
【发布时间】:2015-07-14 22:53:04
【问题描述】:

我正在使用 Django Rest API 框架,我想使用 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')

在我看来,我在 viewets.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': u'1', 'images': {u'name': u'test-image.png', u'lastModifiedDate': u'2015-04-22T08:51:11.000Z ', u'webkitRelativePath': u'', u'lastModified': 1429692671000, u'type': u'image/png', u'size': 43152}}, {'project': u'1', '图片': {u'name': u'test.png', u'lastModifiedDate': u'2015-04-08T08:35:17.000Z', u'webkitRelativePath': u'', u'lastModified': 1428482117000 , u'type': u'image/png', u'size': 127433}}]

但它给了我一个错误 'dict' object has no attribute 'pk'

我的 photo_array 变量是否导致了这个问题?

【问题讨论】:

  • 如果您在帖子中包含错误的回溯,这将非常有用。

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


【解决方案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,但您的序列化程序实际上并不匹配。

【讨论】:

    【解决方案2】:

    我认为你应该用 id 字段更新你的 UploadSerializer

    【讨论】:

    • 您好,欢迎来到 StackOverflow。您能否详细说明您的答案,也许添加一个代码示例和解释,以帮助其他用户理解为什么/如何解决问题?
    • 您好,感谢您的回答。您的意思是将 'id' 添加到 UploadSerializer 的字段中?.
    • 使用 project_id 键代替项目 "[{'project': u'1'," 并让 m 知道
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 2017-06-17
    • 2017-08-11
    • 2016-06-30
    • 2021-04-28
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    相关资源
    最近更新 更多