Reputation: 1129
In model.py
, I've two models
class student(models.Model):
name = models.CharField(max_length=255)
registration_number = models.CharField(max_length=255)
session = models.CharField(max_length=255)
college = models.ForeignKey(to='college', on_delete=models.CASCADE)
class Meta:
db_table = 'student'
class semester(models.Model):
semester = models.IntegerField()
student = models.ForeignKey(to='student', on_delete=models.CASCADE)
sgpa = models.FloatField()
grade = models.CharField(max_length=255)
is_fail = models.BooleanField(default=True)
class Meta:
db_table = 'semester'
Serializer classes looks like
class SemesterSerializer(serializers.ModelSerializer):
class Meta:
model = models.semester
fields = ('id', 'semester', 'sgpa', 'grade', 'is_fail',)
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = models.student
fields = ('id', 'name', 'registration_number', 'college', 'session',)
and views.py
contains
class SemesterViewSet(viewsets.ModelViewSet):
def get_queryset(self):
if 'semester' in self.kwargs:
return models.semester.objects.filter(semester=self.kwargs['semester'])
else:
return models.semester.objects.all()
lookup_field = 'semester'
serializer_class = serializer.SemesterSerializer
url patterns are
router = DefaultRouter()
router.register('semester', views.SemesterViewSet, base_name='semester')
urlpatterns = [
url(r'', include(router.urls)),
]
When I tried to visit url/semester/8
, MultipleObjectsReturned
exception raised and showes get() returned more than one semester -- it returned 2!
error message. Here I've not used any get()
method. Why this is happening and what is solution? I need to show all result of semester.
Upvotes: 1
Views: 1966
Reputation: 88609
Remove lookup_field
from view or change it to lookup_field = 'id'
The error is because while you calling a retrieve()
method, inside it invokes a get_object()
which is sililar to the query similar to
semester.objects.get(semester=semester.objects.get(id=8).semester)
semester.objects.get(lookup_field=parameter)
example:
semester.objects.get(semester=8)
So, if there is more than 1 semester instances have same semester
value, it would raise an error
UPDATE-1
Try to override retrieve()
method in view,
from rest_framework.response import Response
class SemesterViewSet(ModelViewSet):
def get_queryset(self):
if 'semester' in self.kwargs:
return semester.objects.filter(semester=self.kwargs['semester'])
else:
return semester.objects.all()
lookup_field = 'semester'
serializer_class = SemesterSerializer
def retrieve(self, request, *args, **kwargs): # Change is here <<
serializer = self.get_serializer(self.get_queryset(), many=True)
return Response(data=serializer.data)
Upvotes: 4