как через DRF добавить данные в модель со связанными полями

Рейтинг: 0Ответов: 1Опубликовано: 11.02.2023

Добрый день есть модель со связанными полями

class Car(models.Model):
    car_number = models.CharField(unique=True, max_length=12, verbose_name='Зав. № машины')
    technic = models.ForeignKey('Technic', on_delete=models.CASCADE, verbose_name='Модель техники')
    engine = models.ForeignKey('Engine', on_delete=models.CASCADE, verbose_name='Модель двигателя')
    engine_number = models.CharField(max_length=12, verbose_name='Зав. № двигателя')
    transmission = models.ForeignKey('Transmission', on_delete=models.CASCADE, verbose_name='Модель трансмиссии')
    transmission_number = models.CharField(max_length=12, verbose_name='Зав. № трансмиссии')
    driving_bridge = models.ForeignKey('DrivingBridge', on_delete=models.CASCADE, verbose_name='Модель ведущего моста')
    driving_bridge_number = models.CharField(max_length=12, verbose_name='Зав. № ведущего моста')
    controlled_bridge = models.ForeignKey('ControlledBridge', on_delete=models.CASCADE, verbose_name='Модель управляемого моста')
    controlled_bridge_number = models.CharField(max_length=12, verbose_name='Зав. № управляемого моста')
    delivery_contract = models.CharField(max_length=20, verbose_name='Договор поставки №, дата')
    date_shipment = models.DateField(default=datetime.now, verbose_name='Дата отгрузки с завода')
    consignee = models.CharField(max_length=200, verbose_name='Грузополучатель (конечный потребитель)')
    delivery_address = models.CharField(max_length=200, verbose_name='Адрес поставки (эксплуатации)')
    equipment = models.TextField(blank=False,verbose_name='Комплектация (доп. опции)', default="Стандарт")
    client = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Клиент')
    service_company = models.ForeignKey('ServiceCompany', on_delete=models.CASCADE, verbose_name='Сервисная компания')

    def __str__(self):
        return f'Зав. № машины ->{self.car_number}'

    class Meta:
        verbose_name = 'Машина'
        verbose_name_plural = 'Машины'

есть сериализер:

class CarSerializer(serializers.ModelSerializer):
        
    class Meta:
        model = Car
        fields = '__all__'
        depth = 1

метод GET работает отлично

{
        "id": 1,
        "car_number": "0017",
        "engine_number": "7ML1035",
        "transmission_number": "21D0108251",
        "driving_bridge_number": "21D0107997",
        "controlled_bridge_number": "21D0093265",
        "delivery_contract": "101",
        "date_shipment": "2022-03-09",
        "consignee": "ВЧ 45",
        "delivery_address": "п. Знаменский, Респ. Марий Эл",
        "equipment": "1. Гидролинии с БРС;\r\n2. Дополнительная установка парной кабины",
        "technic": {
            "id": 1,
            "name": "ПД1,5",
            "description": "После прохода снегоочистителей сдвигающего действия образуются снежные валы, которые необходимо убирать. Для этой работы используется несколько разных типов техники. Один из вариантов — шнекороторный снегоуборщик с активным рабочим органом. Изначально они были созданы для пробивки путей через многометровые снежные слои, но в городах и на трассах их применяют для уборки снежных валов, оставленных плужными снегоочистителями.Эта машина называется ДЭ-226. Много лет она выпускалась на минском заводе «Ударник», который был главным производителем такого оборудования в СССР. Сейчас шнекороторы собирают уже не в Минске, а в Пинске. Конструктивно ДЭ-226 восходит еще к американскому Snogo, поставлявшемуся в СССР по ленд-лизу в период ВОВ. По сути это эдакий «автомат Калашникова» среди снегоочистителей — отработанный десятилетиями и доказавший свою профпригодность, остающийся актуальным несмотря на возраст. Чаще шнекороторы используют все-таки на трассах, но иногда выводят и на городские улицы, если вдоль них есть место, куда перебросить снег."
        },
        "engine": {
            "id": 1,
            "name": "Kubota D1803",
            "description": "Двигатель – энергосиловая машина, преобразующая какой-либо вид энергии в механическую работу. Еще двигатель называют \"мотором\", что было позаимствовано из немецкого языка. Различают различные типы двигателей из которых широкое распространение получили двигатели внутреннего сгорания и электрические двигатели. Существует более подробная классификация двигателей внутреннего сгорания."
        },
        "transmission": {
            "id": 1,
            "name": "10VA-00105",
            "description": "Сцепление .."
        },
        "driving_bridge": {
            "id": 6,
            "name": "20VA-00101",
            "description": "Ведущие мосты. х."
        },
        "controlled_bridge": {
            "id": 1,
            "name": "VS20-00001",
            "description": "Управляемые е."
        },
        "client": {
            "id": 8,
            "password": "pbkdf2_sha256$390000$x8Wm3QXhLkYcOlniLgd3Cm$zjjaAJH+SuFMJ3t4vZZEoo2W1hhUO3PKfa47Vz7qp5Q=",
            "last_login": null,
            "is_superuser": false,
            "username": "umba",
            "first_name": "Юмба",
            "last_name": "",
            "email": "umba@ya.ru",
            "is_staff": false,
            "is_active": true,
            "date_joined": "2023-02-08T10:49:00Z",
            "groups": [
                1
            ],
            "user_permissions": []
        },
        "service_company": {
            "id": 2,
            "name": "ООО Силант",
            "description": "Сервисный центр — организация."
        }
    },
    {

Подскажите как реализовать метод РOST для модели с вложенными полями ( с плоской моделью работает без проблем ) а с вложенной уже всю голову поломал (((

Ответы

▲ 0

Я нашел решение: нужно было убрать параметр вложенной сериализации (depth)

Вот что у меня получилось:

class CarSerializer(serializers.ModelSerializer):
        
    class Meta:
        model = Car
        fields = '__all__'
        # depth = 1 (убрал)

теперь я записываю параметры по id связанных полей.