#python #django #django-models #django-rest-framework #m2m
Вопрос:
У меня есть следующие две модели, в которых продукт может иметь много категорий, а Категория может иметь много связанных с ней продуктов:
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 # products = [2, 8, 4, 22] # category = 'xyz' """ 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)
Порядок товаров определяется в зависимости от категории, в которой они находятся. Например , если у нас есть продукт p1
, и p2
в категориях x
и y
, как в следующем:
category x: p1, p2 category y: p1, p2
и я выполняю просьбу как таковую:
products [p2, p1] category = 'x'
Порядок становится
category x: p2, p1 category y: p1, p2
Обновляется только порядок продуктов в x category
, поэтому product p1
, например, по-прежнему сохраняется порядок индекса[0] в category y
, в то время как он был обновлен в вызываемой категории.
Последние пару дней я пытался найти решение, но ничего такого, что работало бы так, как задумывалось. Любая помощь будет признательна!