Как проверить, существует ли объект перед добавлением в представление django api

У меня есть список избранного, но для курсов, пользователь может добавлять курсы, которые хочет видеть в будущем, я хочу проверить существует курс в списке или нет, прежде чем добавлять его, если существует, скажите, что он существует, если нет, добавьте его в список


    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)

модель


    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']

Вы можете использовать метод exists() в Django

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

Попробуйте это

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

проблема в том, что вы возвращаете ответ в методе get_queryset, однако использование этого метода отличается от того, что вы делаете.
Вместо этого вы можете проверить существование и вернуть правильный ответ в методе create следующим образом:

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

Если вы хотите, чтобы курсы были уникальными для пользователя, вы можете сделать ограничение базы данных на эти 2 поля. Проблема с другими решениями заключается в условиях гонки, так как 2 вызова API, запущенные одновременно, могут испортить вашу проверку на существование.

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

except IntegrityError:
   return Response("Item already exists", status.HTTP_400_BAD_REQUEST)
Вернуться на верх