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 serializerBattleSerializer
. The serializer field might be incorrectly and not match any attribute or key on theBattleLyric
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