2015-05-05 3 views
0

Я использую Django Rest API Framework, я хочу загрузить несколько изображений для одного проекта, используя Angular js.'dict' объект не имеет атрибута 'pk' Django Rest API Framework

Вот моя модель:

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': 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 ' , 'images': {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}}]

Но это дает мне ошибку 'ДИКТ' объект не имеет атрибута 'рк'

Был ли мой photo_array переменной причиной e эта проблема ?.

+0

Было бы невероятно полезно, если бы вы включили трассировку ошибки в свой пост. –

ответ

0

Я думаю, вы должны обновить UploadSerializer с поля ид

+2

Привет, partha и добро пожаловать в StackOverflow. Не могли бы вы немного рассказать о своем ответе, добавив, возможно, образец кода и объяснение, чтобы помочь другим пользователям понять, почему/как это решит проблему? – Christina

+0

Привет partha Спасибо за ответ. Вы имеете в виду добавление ** 'id' ** к полям в ** UploadSerializer **?. –

+0

используйте ключ project_id вместо проекта «[{'project': u'1 '," и пусть m знает – jatin

1

Без TRACEBACK, я могу взять только обоснованное предположение относительно того, что проблема на самом деле.

Вы используете стандарт 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, но ваши сериализаторы на самом деле не совпадают.

Смежные вопросы