#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… Я думаю, что моя голова уже была размыта после стольких часов работы … или я просто глуп. В любом случае, спасибо!