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

#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 , в то время как он был обновлен в вызываемой категории.

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

Ответ №1:

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

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

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

3. добавьте новый заказ, который вы хотите, с помощью category.product_items.add(your_product)

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