Django SortedManyToManyField выполнить переупорядочивание

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

from sortedm2m.fields import SortedManyToManyField


class Product(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=250)
    is_visible = models.BooleanField(default=True)
    categories = SortedManyToManyField(to=Category, blank=True, related_name="product_items")
    number = models.CharField(max_length=150, blank=True, null=True)
    description = models.TextField(null=True, blank=True)
    related_product_items = models.ManyToManyField(to="self", blank=True)


class Category(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    parent = models.ForeignKey(
        to="self", on_delete=models.SET_NULL, null=True, blank=True, related_name="subcategories",
    )
    name = models.CharField(max_length=250)
    is_visible = models.BooleanField(default=True)

Мой сериализатор ProductOrderingSerializer:

class ProductOrderingSerializer(serializers.Serializer):
    products = serializers.ListSerializer(child=serializers.UUIDField(), required=True)
    category = serializers.UUIDField(required=True)

Мое мнение:

class ProductViewSet(ModelViewSet):
    @transaction.atomic
    @action(methods=["put"], detail=False)
    def order(self, request):
        """
        this end point receives list of ids and changes order of products per 
        category
        """
        serializer = ProductOrderingSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        queryset = self.queryset.filter(id__in=serializer.validated_data["products"])
        category = serializer.validated_data["category"]
        for index, product_id in enumerate(serializer.validated_data["products"]):
            # how to perform product ordering per the submitted category?
            pass
        self.action = "list"
        return self.list(request=request)

Последние пару дней я пытаюсь найти решение, но ничего, что работало бы так, как задумано. Любая помощь будет оценена по достоинству!

Следующая концепция будет работать для вас

1. получить категорию и получить все связанные продукты, чтобы сохранить их в старой последовательности (вы должны загрузить их в память, а не оставлять в виде запроса )

2. очистите все связанные m2m с помощью category.product_items.clear()

3. добавьте новый заказ, используя category.product_items.add(your_product)

4. добавьте старые оставшиеся в старой последовательности из #1 (добавьте их все, если они будут найдены, то будут добавлены снова)

Вернуться на верх