@No_name451

Как обработать дополнительная данные в serializers/views?

Добрый день.

Инстресует возможность реализации дополнительной обработки данных в сериализаторе/вьюхе.

Есть 2 модели:

Catalog:
Описание (TextField).

Item:
Каталог (Foreign key - Catalog);
Название (Charfield);
Цена (PositiveIntegerField).

Условие такого, что прилетает POST запрос с несколькими объектами Item для их валидации и создания. Но условие в том, что foreign key не указывается в каждом объекте, а лишь один раз с запросом. Если же foreign key вообще не указан, то тогда создаются объекты Item с foreign key на последний элемент Catalog.

Пример (POST):
[
    {
        "catalog": 1
    },
    {
        "name": "item 1",
        "price": 999
    },
    {
        "name": "item 2",
        "price": 1999
    }
]

Соответственно, создаётся 2 объекта Item, с указанием foreign key на Catalog с pk равным 1.

Как я предполагаю, стоит во вьюхе проверять поступивший json на наличие в нем ключевого слова "catalog".
Если слово есть:
Делать запрос в бд, запрашивая элемент Catalog с указанным pk. Далее передать данные сериализатору.
Иначе:
Взять из бд последний элемент Catalog, передать данные сериализатору.
В самом сериализаторе проверять соответственно данные, создавать объекты.

Как лучше реализовать данную возможность (какую вьюху использовать, какой сериализатор, какие методы стоит переопределить)?

Заранее благодарю за помощь.
  • Вопрос задан
  • 40 просмотров
Решения вопроса 1
@gh0sty
Веб-разработчик. Пишу под Python Django.
По-хорошему, надо раскидать на 2 разных эндпоинта.
Но если писать при таких и только таких запросах, то:

class Items(APIView):
    ...
    def post(self, request):
        data = request.data.copy()
        if data:
            catalog = False
            if 'catalog' in data[0].keys():
                catalog_id = data[0]['catalog']
                del data[0]
                if Catalog.objects.filter(id=catalog_id):
                    catalog = Catalog.objects.get(id=catalog_id)
            if not catalog:
                catalog = Catalog.objects.order_by('-created')[0]
            response_data = []
            for item_data in data:
                item_serializer = ItemSerializer(item_data)
                if item_serializer.is_valid():
                    item_serializer.save(catalog=catalog)
                     response_data.append({
                         'success': True, 
                         'item': item_serializer.data
                     })
                else:
                    response_data.append({
                         'success': False, 
                         'errors': item_serializer.errors
                    })
            # returning success answer with response_data


P.S. Писал в слепую.
Охх... Молодежь, попривыкли всё тупо по сериалайзерам раскидать и назвать это работой, backend - это писать логику.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы