Я улучшаю свой предыдущий ответ и предлагаю решение своей проблемы, указанной в комментариях к принятому ответу.
Это принятое решение создает массив объектов Column и использует его для выбора этих столбцов. В Spark, если у вас есть вложенный DataFrame, вы можете выбрать дочерний столбец следующим образом: df.select("Parent.Child")
, и это возвращает DataFrame со значениями дочернего столбца и называется Child . Но если у вас есть идентичные имена для атрибутов различных родительских структур, вы теряете информацию о родительском элементе и можете получить идентичные имена столбцов и больше не сможете получить к ним доступ по имени, поскольку они однозначны.
Это была моя проблема.
Я нашел решение своей проблемы, может быть, оно может помочь кому-то еще. Я вызвал flattenSchema
отдельно:
val flattenedSchema = flattenSchema(df.schema)
, и это вернуло объекты Array of Column. Вместо использования этого в select()
, который возвращал бы DataFrame со столбцами, названными потомком последнего уровня, я сопоставил исходные имена столбцов с самими собой как строки, затем после выбора столбца Parent.Child
он переименовал его в Parent.Child
вместо Child
(для удобства я также заменил точки подчеркиванием):
val renamedCols = flattenedSchema.map(name => col(name.toString()).as(name.toString().replace(".","_")))
А затем вы можете использовать функцию выбора, как показано в исходном ответе:
var newDf = df.select(renamedCols:_*)
Есть два способа решить эту проблему:
Создайте экземпляр вашей модели с начальными значениями для отсутствующих, но обязательных полей:
company = Company.objects.get(pk=company_id)
fleet = Fleet(company=company)
form = FleetForm(request.POST, instance=fleet)
new_fleet = form.save()
Используйте save (commit = False)
и вручную установите любые дополнительные обязательные поля:
company = Company.objects.get(pk=company_id)
form = FleetForm(request.POST)
fleet = form.save(commit=False)
fleet.company = company
new_fleet = fleet.save()
См. Примечание в этом разделе документации API ModelForm для более подробной информации.
Кстати, либо editable = False
] или exclude
достаточно для удаления поля из ModelForm
; вам не нужны оба.