AngelQuesada
AngelQuesada

Reputation: 431

Got AttributeError when attempting to get a value for field `name` on serializer

I'm new with this django rest framework thing and I'm having a problem showing one of my models in the api interface.

I have 3 models that are related License, Profile and Rules. I can see Profile and License clearly but Rules (which is related with profile and license) gives me the next error:

Got AttributeError when attempting to get a value for field name on serializer LicenseSerializer. The serializer field might be named incorrectly and not match any attribute or key on the Rule instance. Original exception text was: 'Rule' object has no attribute 'name'.

This is my model file:

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)

This is the serializers.py file:

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 file:

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)

I know that I must be missing something super stupid but I have been here for hours and I can't find it.

Any help will be appreciated

Upvotes: 0

Views: 1031

Answers (1)

Ykh
Ykh

Reputation: 7717

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 should be serializer_class = RuleSerializer

Upvotes: 2

Related Questions