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

У меня есть модель django с 3 полями: "product", "price_1" и "price_2".

Я хотел бы сериализовать эту модель таким образом, чтобы результат был:

{
   "product": "some product",
   "price": {
      "price_1": 15.00,
      "price_2": 25.00
   }
}

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

#Models

class Product(models.Model):
   product = models.CharField()
   price = models.ForeignKey(Price)

class Price(models.Model):
   price_1 = models.FloatField()
   price_2 = models.FloatField()

#Serializers

class PriceSerializer(serializers.ModelSerializer):
   class Meta:
      model = Price
      fields = ['price_1', 'price_2']

class ScheduleSerializer(serializers.ModelSerializer):
   price = PriceSerializer()

   class Meta:
      model = Product
      fields = [
         "product", 
         "price",
      ]

Это сработало, но очень неэффективно. Есть ли способ добиться того же результата, но имея только одну модель, например:

class Product(models.Model):
   product = models.CharField()
   price_1 = models.FloatField()
   price_2 = models.FloatField()

И было бы еще лучше, если бы я мог иметь только цифры без слова "цена":

{
   "product": "some product",
   "price": {
      1: 15.00,
      2: 25.00
   }
}

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

Заранее спасибо!

Вы можете использовать аргумент source [DRF docs] для передачи всего объекта во вложенный сериализатор, который будет обрабатывать только поля цены, чтобы сделать это.

модели:

class Product(models.Model):
   product = models.CharField()
   price_1 = models.FloatField()
   price_2 = models.FloatField()

сериализаторы:

class ProductPriceSerializer(serializers.ModelSerializer):
   class Meta:
      model = Product
      fields = ['price_1', 'price_2']


class ProductSerializer(serializers.ModelSerializer):
   price = ProductPriceSerializer(source='*')

   class Meta:
      model = Product
      fields = [
         "product",
      ]

Получение 1 или 2 в качестве ключей было бы немного сложнее, и я воздерживаюсь от этого, так как это было бы несколько халтурно. Но если двигаться дальше, оказывается, что схема вашей модели (обеих) не нормализована, на самом деле лучше иметь разные модели на случай, если вам нужно обработать несколько цен, приведенный ниже код будет лучше моделировать для вашего случая использования:

class Product(models.Model):
   product = models.CharField()


class Price(models.Model):
   price = models.ForeignKey(Product)
   price = models.FloatField()  # use a DecimalField instead for prices!
Вернуться на верх