Хобрук: Ваш путь к мастерству в программировании

Как я могу исправить конфликт метакласса django rest framework

Я новичок, изучающий структуру отдыха django, и я только что столкнулся с этой ошибкой, и я не могу найти способ ее обойти. Вот пример кода разрешения.py

from rest_framework import permissions

class UpdateOwnProfile(permissions, BaseException): 
"""Allow user to edit their own profile"""

 def has_object_permission(self, request, view, obj):
    """Check if user is trying to update their own profile"""
    if request.method in permissions.SAFE_METHODS:
        return True

    return obj.id == request.user.id

Вот также пример кода примеров views.py

from rest_framework.views import APIView 
from rest_framework.response import Response 
from rest_framework import status 
from rest_framework import viewsets 
from rest_framework.authentication import TokenAuthentication

from profiles_api import serializers 
from profiles_api import models from profiles_api import permissions

class HelloApiView(APIView): """Test Api view""" serializer_class = serializers.HelloSerializer

def get(self, request, format=None):
    """Returns a list of Api features"""
    an_apiview = [
        'Uses HTTP methods as function (get, post, patch, put, delete)',
        'Is similar to a traditional Django view',
        'Gives you the most control over your application logic',
        'Is mapped manually to URLs',
    ]
    return Response({'message': 'Hello', 'an_apiview': an_apiview})

def post(self, request):
    """Create a hello message with our name"""
    serializer = self.serializer_class(data=request.data)

    if serializer.is_valid():
        name = serializer.validated_data.get('name')
        message = f'Hello {name}'
        return Response({'message': message})
    else:
        return Response(
            serializer.errors,
            status = status.HTTP_400_BAD_REQUEST
        )

def put(self, request, pk=None):
    """Handling updates of objects"""
    return Response({'method': 'PUT'})

def patch(self, request, pk=None):
    """Handle a partial update of an object"""
    return Response({'method': 'PATCH'})

def delete(self, request, pk=None):
    """Delete an object"""
    return Response({'method': 'DELETE'})
class HelloViewset(viewsets.ViewSet): """Test API Viewset""" serializer_class = serializers.HelloSerializer

def list(self, request):
    """Return a hello message"""
    a_viewset = [
        'Uses actions (list, create, retrieve, update, partial update'
        'Automatically maps to URLs using router'
        'provides more functionality with less code'
    ]
    return Response({'message': 'Hello', 'a_viewset': a_viewset})

def create(self, request):
    """Create a new hello message"""
    serializer = self.serializer_class(data=request.data)

    if serializer.is_valid():
        name = serializer.validated_data.get('name')
        message = f'Hello {name}!'
        return Response({'message': message})
    else:
        return Response(
            serializer.errors,
            status=status.HTTP_400_BAD_REQUEST
        )
def retrieve(self, request, pk=None):
    """Handle getting an object by its ID"""
    return Response({'http_method': 'GET'})

def update(self, request, pk=None):
    """Handle updating an object"""
    return Response({'http_method': 'PUT'})

def partial_update(self, request, pk=None):
    """Handle updating of an object"""
    return Response({'http_method': 'PATCH'})

def destroy(self, request, pk=None):
    """Handle removing an object"""
    return Response({'http_method': 'DELETE'})
class UserProfileViewSet(viewsets.ModelViewSet): """Handle creating and updating profiles""" serializer_class = serializers.UserProfileSerializer queryset = models.UserProfile.objects.all() authentication_classes = (TokenAuthentication,) permission_classes = (permissions.UpdateOwnProfile,)

И при запуске сервера разработки я получаю эту ошибку:

класс UpdateOwnProfile (разрешения, BaseException): TypeError: конфликт метаклассов: метакласс производного класса должен быть (нестрогим) подклассом метаклассов всех его баз


  • ваш код не отформатирован. Трудно читать ваш код. 20.11.2019

Ответы:


1

permissions (rest_framework.permissions) имеет тип module (чей тип type FWIW), но тип BaseExceptiontype (как и все обычные классы). Итак, у вас есть конфликт метаклассов, как и ожидалось.

Предположительно, вы имели в виду использовать класс permissions.BasePermission из модуля:

class UpdateOwnProfile(permissions.BasePermission, BaseException):
    ...
    ...

Вы также можете импортировать и ссылаться на класс напрямую:

from rest_framework.permissions import BasePermission

class UpdateOwnProfile(BasePermission, BaseException):
        ...
        ...
20.11.2019
Новые материалы

5 проектов на Python, которые нужно создать прямо сейчас!
Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

«Очень простой» эволюционный подход к обучению с подкреплением
В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..