Как разместить данные массива через сериализаторы? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу опубликовать некоторые данные массива через метод создания сериализатора.Как получить данные массива в методе создания сериализатора?

Это мой результат, который выдает ошибку из-за данных массива.Я должен опубликовать ниже конкретные, inch_first ... данные о скорости массива данных.

{
    "order_media": {
        "client_employee": "4",
        "client": "63",
        "narration": "Print ad",
        "vendor": "68",
        "total_amount": "2590.00",
        "discount_rate_client": "10.00",
        "discount_amount_client": "259.00",
        "service_percentage": "10.00",
        "service_amount": "259.00",
        "client_vat": "388.50",
        "total_receivable": "2978.50",
    },
    "pub_date": "2019-04-03",
    "particular": ["Banner", "Poster", "Plastic banner"],
    "inch_first": ["4", "5", "3"],
    "inch_second": ["4", "5", "3"],
    "size": ["16.00", "25.00", "9.00"],
    "quantity": ["5", "5", "6"],
    "rate": ["10", "10", "10"],
}

Это моя модель

class RequestPrintProduction(models.Model):
    particular = models.CharField(max_length=255,null=True,blank=True)
    inch_first = models.CharField(max_length=45,null=True,blank=True)
    inch_second = models.CharField(max_length=45,null=True,blank=True)
    size = models.CharField(max_length=45,blank=True, null=True)
    quantity = models.CharField(max_length=45,null=True, blank=True)
    rate = models.DecimalField(max_digits=12, decimal_places=2, default=Decimal(0.00), null=True, blank=True)
    pub_date = models.DateField(blank=True, null=True)
    vendor = models.ForeignKey(Party, blank=True, null=True)
    request_id = models.ForeignKey(Request, blank=True, null=True, related_name='requestprint')

    def __str__(self):
        return self.particular

это мои api просмотров:

class PrintRequestAPIView(ListBulkCreateAPIView):
    serializer_class = RequestPrintSerializer

это мой сериализатор:

class RequestPrintSerializer(serializers.ModelSerializer):
    order_media = OrderMediaSerializer(required=False)

    class Meta:
        model = RequestPrintProduction
        fields = '__all__'

    def create(self, validated_data):
        service_request = Request()
        service_request.save()

        validated_data['request_id'] = service_request
        order_media = validated_data.pop('order_media')
        print(order_media)

        online_service_request = self.Meta.model.objects.create(**data)

        order_media['request_id'] = service_request
        order_media = OrderMedia.objects.create(**order_media)

        return online_service_request

Я ожидаю успешного размещения данных массива.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Давайте попробуем упорядочить почтовые данные, как показано ниже. И затем всякий раз, когда вы инициализируете RequestPrintSerializer для этого запроса, инициализируйте сериализатор со многими = True. Надеюсь, поможет. Удачи.

{
  "order_media": {
    "client_employee": "4",
    "client": "63",
    "narration": "Print ad",
    "vendor": "68",
    "total_amount": "2590.00",
    "discount_rate_client": "10.00",
    "discount_amount_client": "259.00",
    "service_percentage": "10.00",
    "service_amount": "259.00",
    "client_vat": "388.50",
    "total_receivable": "2978.50"
  },
  "request_print_production": [
    {
      "pub_date" : "2019-04-03",
      "particular": "Banner",
      "inch_first": "4",
      "inch_second": "4",
      "size": "16.00",
      "quantity": "5",
      "rate": "10"
    },
    {
      "pub_date" : "2019-04-03",
      "particular": "Poster",
      "inch_first": "5",
      "inch_second": "5",
      "size": "25.00",
      "quantity": "5",
      "rate": "10"
    },
    {
      "pub_date" : "2019-04-03",
      "particular": "Plastic Banner",
      "inch_first": "3",
      "inch_second": "3",
      "size": "9.00",
      "quantity": "6",
      "rate": "10"
    }
  ]
}
0 голосов
/ 03 апреля 2019

Кажется, у вас есть поле char в вашей базе данных, но вы хотите опубликовать массив в DRF.На самом деле, как уже упоминалось в комментариях, это проблема почти со всеми вашими полями.Кажется, вы можете обойти это, просто пропуская струны повсюду.

Без поддержки базы данных это не будет работать напрямую.Однако, если вы do действительно хотите это сделать, вам придется выполнить часть работы в своем собственном коде. есть настраиваемые поля для этого где-то, возможно, но я никогда не видел их.

JSON Post Only

Вот простой способ сделать эточто:

  1. Объявите поле вашего сериализатора напрямую как ListField
  2. В функции 'validate' преобразуйте в строку (csv, json.dumpsи т. д.)
  3. Обратите внимание, что я не проверяю пустые значения, настройки по умолчанию и т. д. Пожалуйста, ознакомьтесь с документацией (и источником) для ListField самостоятельно.
class Serializer(ModelSerializer):
    particular = ListField(child=CharField(max_length=10))

    def validate_particular(self, value):
        """Convert the list to a json string, and do extra validation if needed"""
        return json.dumps(value)

Ввод и вывод (Post & Get)

Если вы используете это как для ввода, так и для вывода и хотите вернуть список из вашей модели, вам нужно будет создать настраиваемое поле:

class ListAsJsonField(fields.ListField):
    """
    Converts an incoming list of string values to json.
    This field is _very_ primitive, lots of edge cases may break it.
    """
    child = fields.CharField(min_length=1) # always use a char field

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def to_representation(self, data):
        """Convert to our output representation.  Assumes input is always valid json now"""
        return json.loads(data)

    def to_internal_value(self, data):
        """Convert to the internal value -> database (and validated_data)"""
        return json.dumps(data)

class MySerializer(serializers.ModelSerializer):
    particular = ListAsJsonField(required=True, min_length=1)
    ...

Примечания:

В некоторых базах данных, таких как postgres, есть настраиваемое поле JSON и поле массива.Джанго поставляется с полями для тех, кто в django.contrib.postgres.Используя их, вы также захотите исправить другие проблемы с моделью.

Какого черта ListBulkCreateAPIView?

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