Как добавлять и отправлять файловые данные в составной форме react с помощью серверной части Django с вложенным JSON

Итак, у меня есть форма данных в соответствующем формате JSON

  project_status: 'OPEN',
    project_title: '',
    project_code: '',
    start_date: '',
    end_date: '',
    duration: '',
    engagement_year: '',
    financial_year: '',
    project_budget: '',
    domain: '',
    project_type: '',
    project_mou: null,
    other_docs: null,
    thirdAgencyDetails: {
      government_body: '',
      scheme_name: '',
      sanctioned_budget: '',
      industry_contribution: '',
      government_contribution: '',
      agreement: null,
      sanction_letter: null,
      proposal_doc: null
    },
    facultyDetails: [],

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

class Project(models.Model):
    user = models.CharField(max_length=15, null=True)
    project_title = models.CharField(max_length=250, null=True)
    project_code = models.CharField(max_length=250, null=True)
    start_date = models.DateField(max_length=10, null=True, default='')
    end_date = models.DateField(max_length=10, null=True, default='')
    duration = models.CharField(max_length=255)
    engagement_year = models.IntegerField()
    financial_year = models.CharField(max_length=255)
    project_budget = models.DecimalField(max_digits=10, decimal_places=2)
    domain = models.CharField(max_length=250, null=True)
    project_type = models.CharField(max_length=255)
    project_status=models.CharField(max_length=250, blank=True)
    thirdAgencyDetails = models.OneToOneField(ThirdAgencyDetail, on_delete=models.CASCADE, null=True, blank=True)
    project_mou = models.FileField(upload_to='R&D_docs/', blank=True)
    other_docs = models.FileField(upload_to='R&D_docs/', blank=True)

с полем "один к одному", равным

class ThirdAgencyDetail(models.Model):
    government_body = models.CharField(max_length=255)
    scheme_name = models.CharField(max_length=255)
    sanctioned_budget = models.DecimalField(max_digits=10, decimal_places=2)
    industry_contribution = models.DecimalField(max_digits=10, decimal_places=2)
    government_contribution = models.DecimalField(max_digits=10, decimal_places=2)
    agreement = models.FileField(upload_to='jointProject_thirdAgency_docs/',blank=True)
    sanction_letter = models.FileField(upload_to='jointProject_thirdAgency_docs/',blank=True)
    proposal_doc = models.FileField(upload_to='jointProject_thirdAgency_docs/',blank=True)

Я написал код для загрузки формы смотрите суть кода здесь
Я не могу добавить файлы для 'thirdAgencyDetails', поскольку это вложенный JSON-файл, аналогичный

if (formData.project_mou) {
        formDataToSend.append('project_mou', formData.project_mou);
      }

Что я уже пробовал?

      if(formData.thirdAgencyDetails){
        formDataToSend.append('agreement',formData.thirdAgencyDetails['agreement'])

      }
if(formData.thirdAgencyDetails){
        formDataToSend.append('agreement',formData.thirdAgencyDetails.agreement)

      }

но он всегда добавляет его к корневому JSON вместо вложенного JSON, выдавая ошибку

ответ : "{"ошибка": "Project() получил неожиданные аргументы ключевого слова: "соглашение""}" responseText : "{"ошибка":"Project() получил неожиданные аргументы ключевого слова: 'соглашение'"}"

и даже

  if(formData.thirdAgencyDetails){
        formDataToSend.append('thirdAgencyDetails' , {
          'agreement': formData.thirdAgencyDetails.agreement,
          'sanction_letter' : formData.thirdAgencyDetails.sanction_letter,
          'proposal_doc':formData.thirdAgencyDetails.proposal_doc
        })
      }

Даже пробовал это

if(formData.thirdAgencyDetails){
        formDataToSend.append('thirdAgencyDetails' , JSON.stringify(formData.thirdAgencyDetails))
      }

но приведенное выше просто добавляет пустой объект вместо самого объекта!!!

P.s. : Строка в коде gist работает корректно, только вставка во вложенный JSON не работает

if (formData.project_mou) {
        formDataToSend.append('project_mou', formData.project_mou);
      }

как это решить?

Вернуться на верх