Замена отсутствующим значением поля при сохранении modelform

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

Это принятое решение создает массив объектов 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:_*)
7
задан priestc 6 June 2009 в 11:43
поделиться

1 ответ

Есть два способа решить эту проблему:

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

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 ; вам не нужны оба.

9
ответ дан 7 December 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: