how to check if object exist before adding in django api view

549 Views Asked by At

I have a favorite list for course, user can add courses those like to see in future, I want to check course exist in list or not before adding it, if it exists tell it exist before if not add it to list


class AddtoMyCoursesView(viewsets.GenericViewSet):
    serializer_class = MyCoursesListSerializer

    def get_queryset(self, *args, **kwargs):
        pk = self.request.POST.get('pk')
        user = self.request.user
        print(user)
        courses = MyCoursesList.objects.filter(user=user.pk)
        print(courses)
        for course in courses:
            print(course)
            try:
                return MyCoursesList.objects.get_or_create(my_courses=course, id=pk)
            except:
                return Response("Item already exists", status.HTTP_400_BAD_REQUEST)

model


class MyCoursesList(models.Model):
    user = models.ForeignKey('accounts.User', on_delete=models.CASCADE, blank=True)
    courses = models.ForeignKey(Courses, on_delete=models.CASCADE, blank=True,related_name='my_courses')
    added_date = models.DateTimeField(auto_now_add=True)
    teacher = models.ForeignKey(Teacher, on_delete=models.DO_NOTHING, default=1)


class MyCoursesListSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyCoursesList
        fields = ['id', 'user', 'courses', 'added_date', 'teacher']

4

There are 4 best solutions below

1
Afshar Sharifi On

You can use exists() method in Django

if MyCoursesList.objects.filter(id=pk, user=self.request.user.id).exists():
    return Response("Item already exists", status.HTTP_400_BAD_REQUEST)
1
Satosha On

Try this

try:
    MyCoursesList.objects.get(id=pk, user_id=user)
except:
    return Response('Item Exists')
0
Amrez On

the problem is that you are returning the response in get_queryset method, however this method's usage is different from what you are doing.
instead you can check existence and return proper response in create method like this:

class AddtoMyCoursesView(viewsets.GenericViewSet):
    serializer_class = MyCoursesListSerializer

    def create(self, *args, **kwargs):
        pk = self.request.POST.get('pk')
        user = self.request.user

        if MyCoursesList.objects.filter(pk=pk, user=user).exists():
            return Response("Item already exists", status.HTTP_400_BAD_REQUEST)
        
        # Other Statements for creating your new instance
0
Vaibhav lodha On

If you want to keep courses unique as the user, you can make a database constraint over these 2 fields. The problem with other solutions is race conditions as 2 API calls running at the same time can mess up your exists check.

try:         
   return MyCoursesList.objects.create(my_courses=course, id=pk)

except IntegrityError:
   return Response("Item already exists", status.HTTP_400_BAD_REQUEST)