Получение данных из пост-запроса и создание новой ошибки объектной модели: объект dict не имеет атрибута data - PullRequest
1 голос
/ 09 июля 2019

У меня есть проект Django Rest Framework. Я хочу взять стандартный метод создания для Model View Sets в django rest framework. Я хочу создать новый объект модели на основе переданных данных, но я также хотел переопределить некоторые поля, если они передаются через аргументы url.

Так что, если URL-аргументов нет =>, просто создайте объект Soley по умолчанию на основе запроса post. если есть аргументы пространства имен => создать объект по умолчанию на основе запроса post, но использовать аргумент url пространства имен. если есть пространство имен и аргументы пути => создать объект по умолчанию на основе пост-запроса, но использовать аргументы пространства имен и пути .:

Я получаю следующую ошибку:

AttributeError at /api/v2/preferences/namespace1/
'dict' object has no attribute 'data'
Request Method: POST
Request URL:    http://127.0.0.1:8000/api/v2/preferences/namespace1/
Django Version: 2.2.1
Exception Type: AttributeError
Exception Value:    
'dict' object has no attribute 'data'
Exception Location: C:\Users\jandali\AppData\Local\Programs\Python\Python37-32\lib\site-packages\rest_framework\mixins.py in create, line 19
Python Executable:  C:\Users\jandali\AppData\Local\Programs\Python\Python37-32\python.exe
Python Version: 3.7.3
Python Path:    
['C:\\Users\\jandali\\desktop\\ozone-backend\\ozone-framework-python-server',
 'C:\\Users\\jandali\\AppData\\Local\\Programs\\Python\\Python37-32\\python37.zip',
 'C:\\Users\\jandali\\AppData\\Local\\Programs\\Python\\Python37-32\\DLLs',
 'C:\\Users\\jandali\\AppData\\Local\\Programs\\Python\\Python37-32\\lib',
 'C:\\Users\\jandali\\AppData\\Local\\Programs\\Python\\Python37-32',
 'C:\\Users\\jandali\\AppData\\Roaming\\Python\\Python37\\site-packages',
 'C:\\Users\\jandali\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages']
Server time:    Tue, 9 Jul 2019 21:36:07 +0000

Вот набор моделей:

    @permission_classes((IsAuthenticated))
    def create(self, request, *args, **kwargs):
        # print(request)
        namespace = self.kwargs.get('namespace', None)
        path = self.kwargs.get('path', None)
        if namespace is None and path is None:
            return super().create(request)
        if namespace and path is None:
            data = {
                "person":self.request.user,
                'version':self.request.data['version'],
                'namespace':namespace,
                'path':self.request.data['path'],
                'value':self.request.data['value'],
                'user_id':self.request.user.id,
            }
            return super().create(data)
        if namespace and path:
            data = {
                "person":self.request.user,
                'version':self.request.data['version'],
                'namespace':namespace,
                'path':path,
                'value':self.request.data['value'],
                'user_id':self.request.user.id,
            }
            return super().create(data)

1 Ответ

1 голос
/ 10 июля 2019

Я уверен, что вы прямо или косвенно наследуете CreateModelMixin. Вы переопределили метод create и передали словарь в super. Вот где это терпит неудачу.

Вместо этого обрабатывайте все самостоятельно в этом классе, либо переопределяйте метод perform_create, либо определяйте метод save в вашем сериализаторе. В последних двух вариантах вам нужен сериализатор.

Лучшим вариантом будет обработка полных данных в body. Вам не нужно брать вещи из аргументов URL. Это было бы более приятно.

...