Как обрабатывать параллелизм системы закладок в django?

Я попытался реализовать систему закладок для продукта, когда пользователь нажимает на кнопку закладки, это записывается в его таблицу закладок, и обновлять поле bookmark count в Product Model. Однако я столкнулся с блокировкой БД при одновременном поступлении слишком большого количества запросов. Также я понял, что когда пользователи добавляют или удаляют закладку в одно и то же время, возникнут проблемы сопряжения, такие как, пользователи не могут прочитать информацию о продукте или количество закладок, или блокировка БД... Как справиться с параллелизмом в моей ситуации? Я знаю эксклюзивную блокировку, но но это снизит производительность. Пожалуйста, помогите мне.

вот мои коды

class Bookmark(models.Model):
    _id = models.AutoField(primary_key=True, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='bookmark_user')

    def __str__(self):
        return str(self.user)


class BookmarkItems(models.Model):
    _id = models.AutoField(primary_key=True, editable=False)
    user = models.CharField(max_length=255, null=True, blank=True)
    image = models.CharField(max_length=255, null=True, blank=True)
    bookmark = models.ForeignKey(Bookmark, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def image_preview(self):
        if self.image:
            return mark_safe('<img src="{0}" width="75" height="75" />'.format(self.image))
        else:
            return '(No image)'

    def __str__(self):
        return str(self.product)


@api_view(['POST'])
@permission_classes([IsAuthenticated])
def addBookmark(request):
    user = request.user
    user_id = request.data['user']
    product_id = request.data['product_id']
    image = request.data['image']
    product = Product.objects.get(_id=product_id)

    with transaction.atomic():
        bookmark = Bookmark.objects.get_or_create(user=user)
        Product.objects.filter(_id=product_id).update(
            bookmark_count = F('bookmark_count') + 1
        )
        BookmarkItems.objects.create(
            user = user_id,
            image = image,
            bookmark=bookmark[0],
            product=product,
        )
    return Response({'success':'The bookmark has been created.'})


@api_view(['DELETE'])
@permission_classes([IsAuthenticated])
def deleteBookmark(request, pk):
    user =request.user.id
    with transaction.atomic():
        Product.objects.filter(_id=pk).update(
            bookmark_count = F('bookmark_count') - 1
        )
        BookmarkItems.objects.filter(user=user, product=pk).delete()

        return Response({'success': 'The bookmark has been deleted.'})
Вернуться на верх