I’m working with Django Rest Framework and encountered an issue with a ModelSerializer. I was trying to validate the ‘id’ field in request.data using a ModelSerializer, but found that serializer.validated_data was missing the ‘id’ field even though serializer.is_valid() returned True. I’ve since resolved the issue by switching to a simple Serializer, but I’m trying to understand why the ModelSerializer didn’t work as expected. Any insights would be appreciated.
Here’s the relevant code:
Viewset function:
@action(detail=False, methods=['post'])
def listWatchlistitems(self, request):
serializerWatchlist = WatchlistIdSerializer(data=request.data)
user = request.user
print(f'request.data: {request.data}')
if serializerWatchlist.is_valid():
print(f"serializerWatchlist.validated_data.get('id'): {serializerWatchlist.validated_data.get('id')}")
try:
watchlist = Watchlist.objects.get(id=serializerWatchlist.validated_data.get('id'))
#queryset = WatchlistItem.objects.filter(watchlist=watchlist, user=user)
queryset = WatchlistItem.objects.filter(watchlist=watchlist)
serializer = WatchlistItemSerializer(queryset, many=True)
return Response(serializer.data)
except ObjectDoesNotExist:
return Response({"error": "Watchlist with given id does not exist"}, status=status.HTTP_400_BAD_REQUEST)
else:
return Response(serializerWatchlist.errors, status=status.HTTP_400_BAD_REQUEST)
Watchlist model:
class Watchlist(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
name = models.CharField(max_length=200)
def __str__(self):
return self.name
Original ModelSerializer:
class WatchlistIdSerializer(serializers.ModelSerializer):
class Meta:
model = Watchlist
fields = ['id']
Modified Serializer that resolved the issue:
class WatchlistIdSerializer(serializers.Serializer):
id = serializers.IntegerField()
1peer23 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.