Django Rest Framework десериализует набор запросов в другую модель - PullRequest
0 голосов
/ 30 октября 2018

У меня есть общая модель 'Order'. Существуют и другие модели, представляющие другие формы Ордена.

Мне нужно десериализовать эти другие экземпляры в нашу общую модель 'Order'. Поэтому я извлекаю набор запросов и превращаю его в список, но не могу правильно десериализовать его в Order.

Заказ имеет 4 поля: reference, delivery_date, note и customer_note. Другая модель имеет эквивалентные поля с именами external_reference, required_delivery_date, note и customer_note.

class OrderSerializer(serializers.ModelSerializer):
    reference = serializers.CharField(source='external_reference', required=True)
    delivery_date = serializers.DateField(source='requested_delivery_date')
    note = serializers.CharField()
    customer_note = serializers.CharField()

    class Meta:
        model = Order
        fields = ('reference',
              'delivery_date',
              'note',
              'customer_note')

Поскольку вы не можете предоставить QuerySet в качестве ввода данных для сериализатора, я превратил его в список:

orders = AppOrder.objects.all()
data = list(orders.values())
serialized = OrderSerializer(data=data, many=True)

Однако это не работает. Источник не захватывает правильное поле:

delivery_date ': [' Это поле обязательно для заполнения. ']

Может быть, я делаю это совершенно неправильно и что есть лучшие способы десериализации одной модели в другую, если так, пожалуйста, расскажите также.

Редактировать: (добавлено 31 окт)

Ситуация, которую мы имеем, состоит в том, что существует несколько возможных реализаций «Заказа». У нас есть X, у которого есть БД с таблицей заказов. У вас также есть Y с другой таблицей заказов. Мы используем неуправляемые модели для извлечения данных из них. Мы получили конечную точку API для возврата информации о заказе. Эта конечная точка использует модель Порядка, которую мы сделали сами. Когда звонят в конечную точку, мы проверяем, кто делает запрос, переходим к правильной неуправляемой модели и получаем заказы. Проблема в том, что это другие модели, в данном случае AppOrder (s). Таким образом, он возвращает QuerySet AppOrders. Поскольку конечная точка ожидает Order QuerySet, мне нужно превратить AppOrders в Order QuerySet, чтобы я мог отобразить его / отфильтровать / упорядочить / и т. Д., Поэтому я пытаюсь сериализовать AppOrder в Order.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

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

orders = AppOrder.objects.all()
serialized = OrderSerializer(orders, many=True)

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

0 голосов
/ 30 октября 2018
delivery_date = serializers.DateField(source='requested_delivery_date', required=False) 

Это может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...