Логика сериализатора 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,
});
}
});
};
Я также прошу прощения, если я неправильно написал название проблемы. Пожалуйста, поправьте меня, если я ошибаюсь.