Логика сериализатора DRF для преобразования данных

Введение - я использую библиотеку react-table и хочу отображать в ней (если есть) все PZItems и ни одного Item или только Item (если нет PZItems). Я решил, что это будет лучшим решением для отображения данных, так как я не могу иначе спроектировать сериализатор без дублирования данных в любом случае. React-Table не любит данные в различной форме, по крайней мере, мне не удались попытки во время тестов. Последние часы я потратил на попытки сгладить данные сериализатора, которые оказались тупиковыми. Я смог написать код на JS, который преобразует данные сериализатора в нужную мне форму. Однако это не лучшее решение... Ниже приведены упрощенные модели и остальной код.

Как написать сериализатор для соответствия заданной форме? & Как отобразить таблицу с помощью react-table с текущими данными. Второй вопрос задан потому, что я не уверен в правильности своего подхода к проблеме. Однако выполнение какого-то заголовка в середине списка в react-table для элемента, имеющего PZItem, выходит за рамки моих возможностей.

Модели

class PZItem(models.Model):
    item = models.ForeignKey(Item, related_name='pz_items', verbose_name="Przedmiot", on_delete=models.CASCADE)
    quantity_available_to_order = models.IntegerField(default=0)

class Item(models.Model):
    title = models.CharField(max_length=50, unique=True)
    category = models.ForeignKey(Category, related_name='category', on_delete=models.PROTECT, null=True)


Serializer

class TestSerialzier(serializers.ModelSerializer):
    pzitems = serializers.SerializerMethodField()
    class Meta:
        model = Item
        fields = ('__all__')

    def get_pzitems(self, item):
        pzitems = PZItem.objects.filter(item=item).filter(quantity_available_to_order__gt=0)
        return PZItemTestSerializer(
            pzitems,
            many=True,
            context={'request': self.context['request']}
        ).data

Сериализованные данные:

[
    {
        "id": 62,
        "pzitems": [
            {
                "id": 32,
                "quantity_available_to_order": 20
            },
            {
                "id": 33,
                "quantity_available_to_order": 20
            }
        ],
        "title": "Marchewka",
        "category": 1,

    },
    {
        "id": 63,
        "pzitems": [],
        "title": "Kapusta biała",
        "category": 1,
    }
]

Ожидаемые сериализованные данные:

[
    {
      title: "Marchewka",
      category: 1,
      pzitem_id: 32,
      pzitem_quantity_available_to_order: 20,
    },
    {
      title: "Marchewka",
      category: 1,
      pzitem_id: 33,
      pzitem_quantity_available_to_order: 20,
    },
    {
      title: "Kapusta biała",
      category: 1,
      pzitem_id: null,
      pzitem_quantity_available_to_order: null,
    }
]

Я написал функцию javascript, которая преобразует сериализованные данные, которые я получаю от сериализатора, в сериализованные данные, которыми они должны быть.

  const TransformData = (data) => {
    data.map((item) => {
      const pzitems = item["pzitems"];
      if (pzitems.length > 0) {
        pzitems.map((pzitem) => {
          newData.push({
            title: item.title,
            category: item.category,
            pzitem_id: pzitem.id,
            pzitem_quantity_available_to_order:
              pzitem.quantity_available_to_order,
          });
        });
      } else {
        newData.push({
          title: item.title,
          category: item.category,
          pzitem_id: null,
          pzitem_quantity_available_to_order: null,
        });
      }
    });
  };

Я также прошу прощения, если я неправильно написал название проблемы. Пожалуйста, поправьте меня, если я ошибаюсь.

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