Получил ошибку атрибута при попытке получить значение для поля `name` в сериализаторе

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я новичок в этой структуре django rest, и у меня возникла проблема с отображением одной из моих моделей в интерфейсе api.

У меня есть 3 модели, связанные с лицензией, профилем и правилами. Я могу четко видеть профиль и лицензию, но правила (которые связаны с профилем и лицензией) выдают мне следующую ошибку:

Получил ошибку атрибута при попытке получить значение для поля name в сериализаторе LicenseSerializer . Поле сериализатора может быть названо неправильно и не соответствовать какому-либо атрибуту или ключу в Rule экземпляре. Исходный текст исключения был: объект ‘Rule’ не имеет атрибута ‘name’.

Это мой файл модели:

models.py:

 class License(LogsMixin, models.Model):
    """Definicion de modelo para licencias"""

    name = models.CharField(
        "Nombre de la licencia",
        max_length=100,
        null=False,
        blank=False)
    billable = models.BooleanField(default=False)
    dateadded = models.DateTimeField("Fecha de inserción", default=datetime.datetime.now)



class Profile(LogsMixin, models.Model):
    """Definición de modelo para Perfiles"""

    name = models.CharField(
        "Nombre de la perfil de usuario",
        max_length=100,
        null=False,
        blank=False
    )
    dateadded = models.DateTimeField("Fecha de inserción", default=datetime.datetime.now)


class Rule(LogsMixin, models.Model):
    """Definición de modelo para Reglas"""

    FIELDS = [
        ('user_name', 'Nombre de usuario'),
        ('user_code', 'Codigo de usuario')
    ]

    string = models.CharField("Cadena de referencia", max_length=100, null=False, default="", blank=False)
    profile = models.ForeignKey(Profile, null=False, default=None, on_delete=models.DO_NOTHING)
    license = models.ForeignKey(License, null=False, default=None, on_delete=models.DO_NOTHING)
    field = models.CharField("Campo objetivo", max_length=50, default='nombre_usuario', choices=FIELDS)
    include = models.BooleanField("Incluye", null=False, default=True)
    order = models.IntegerField("Orden", null=True, default=None)
    uppercase_sensitive = models.BooleanField("Sensible a las mayúsculas", null=False, default=False)
    dateadded = models.DateTimeField("Fecha de inserción", default=datetime.datetime.now)
  

Это serializers.py файл:

 from rest_framework import serializers

from .models import License, Profile, Rule


class ProfileSerializer(serializers.HyperlinkedModelSerializer):
    
    class Meta:
        model = Profile
        fields = [
            'name',
        ]

class LicenseSerializer(serializers.HyperlinkedModelSerializer):
    
    class Meta:
        model = License
        fields = [
            'name',
            'billable'
        ]

class RuleSerializer(serializers.HyperlinkedModelSerializer):

    license = LicenseSerializer(many=False, read_only=True, allow_null=True)
    profile = ProfileSerializer(many=False, read_only=True, allow_null=True)
    
    class Meta:
        model = Rule
        fields = [
            "string",
            "profile",
            "license",
            "field",
            "include",
            "order",
            "uppercase_sensitive"
        ]
  

routers_view.py файл:

 from django.shortcuts import render
from rest_framework import permissions, viewsets

from .models import Rule, License, Profile
from .serializers import ProfileSerializer, LicenseSerializer, RuleSerializer

class LicenseViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = License.objects.all().order_by('name')
    serializer_class = LicenseSerializer
    permission_classes = [permissions.IsAuthenticated]

class ProfileViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = Profile.objects.all().order_by('name')
    serializer_class = ProfileSerializer
    permission_classes = [permissions.IsAuthenticated]

class RuleViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = Rule.objects.all().order_by('string')
    serializer_class = LicenseSerializer
    permission_classes = [permissions.IsAuthenticated]
  

urls.py

 from rest_framework import routers, serializers, viewsets
from rules.router_views import ProfileViewSet, LicenseViewSet, RuleViewSet

router.register(r'call', CallViewSet)
router.register(r'rules', RuleViewSet)
router.register(r'profiles', ProfileViewSet)
router.register(r'licenses', LicenseViewSet)
  

Я знаю, что я, должно быть, упускаю что-то очень глупое, но я здесь уже несколько часов и не могу его найти.

Любая помощь будет оценена

Ответ №1:

 class RuleViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = Rule.objects.all().order_by('string')
    serializer_class = LicenseSerializer
  

serializer_class = LicenseSerializer должно быть serializer_class = RuleSerializer

Комментарии:

1. Tch… Я думаю, что моя голова уже была размыта после стольких часов работы … или я просто глуп. В любом случае, спасибо!