Как проверить, существует ли объект перед добавлением в представление 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)