Django REST framework returns "Got AttributeError when attempting to get a value for field"

0

The problem I have is when I try to access the api in link is throwing me this error:

  

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

Urls

router = routers.DefaultRouter()
router.register(r'artists', ArtistViewSet)
router.register(r'battles', BattleViewSet)
router.register(r'battlelyrics', BattleLyricViewSet)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(router.urls)),
    url(r'^home$', home, name='home'),
]

Models

class Artist(TimeStampModel):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

class Battle(TimeStampModel):
    name = models.CharField(max_length=50)
    battle_date = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return self.name

class BattleLyric(TimeStampModel):
    artist = models.ForeignKey(Artist)
    battle = models.ForeignKey(Battle)
    lyric = models.TextField()

    def __str__(self):
        return "{}, {} - {}".format(self.id, self.artist, self.battle)

Serializers

class ArtistSerializer(serializers.ModelSerializer):
    class Meta:
        model = Artist
        fields = ('id', 'name', )

class BattleSerializer(serializers.ModelSerializer):
    lyrics = serializers.SerializerMethodField()
    date = serializers.SerializerMethodField()

    def get_lyrics(self, obj):
        lyrics = BattleLyric.objects.filter(battle=obj)
        serializer = BattleLyricSerializer(data=lyrics, many=True)
        serializer.is_valid()
        return serializer.data

    def get_date(self, obj):
        format = obj.battle_date.strftime("%A, %d. %B %Y %I:%M%p")
        return format

    class Meta:
        model = Battle
        fields = ('id', 'name', 'lyrics', 'date', )

class BattleLyricSerializer(serializers.ModelSerializer):
    artist_name = serializers.ReadOnlyField(source="artist.name")

    class Meta:
        model = BattleLyric
        fields = ('id', 'artist', 'artist_name', 'lyric', )

Views

class ArtistViewSet(DefaultViewSetMixin, ModelViewSetMixin):
    queryset = Artist.objects.all()
    serializer_class = ArtistSerializer

class BattleViewSet(DefaultViewSetMixin, ModelViewSetMixin):
    queryset = Battle.objects.all()
    serializer_class = BattleSerializer

class BattleLyricViewSet(DefaultViewSetMixin, ModelViewSetMixin):
    queryset = BattleLyric.objects.all()
    serializer_class = BattleSerializer


def home(request):
    return render(request, 'home.html')

Mixins

class TimeStampModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    deleted_at = models.DateTimeField(blank=True, null=True)

    class Meta:
        abstract = True


class DefaultViewSetMixin(object):
    paginate_by = 25
    paginate_by_param = 'page_size'
    max_paginate_by = 100


class ModelViewSetMixin(viewsets.ModelViewSet):
    pass
    
asked by Edwin Gutiérrez 02.10.2017 в 05:32
source

0 answers