Django bulk_create с использованием списка случайных полей без жестко заданного запроса
Я пытаюсь создать новые экземпляры в своей модели Django, используя bulk_create().
Мои модели:
Class Emotion(models.Model):
emotion_grp_id = models.AutoField(primary_key=True, ...
emotion_group = models.CharField(max_length=55, ...
Class EmotionSubGroup(models.Model):
emotion_sub_grp_id = models.AutoField(primary_key=True, ...
emotion_grp = models.ForeignKey(EmotionGroup, on_delete=models.CASCADE, ...
emotion_sub_group = models.CharField(max_length=55, ...
просмотры.py
Соответствующая часть функции, которую я использую, выглядит так:
def DataUpload (request):
# ...
# ...
df_rawdata = pd.read_csv(csv_file, sep=''). # Dataframe from source (.csv) file
row_iter = df_rawdata.iterrows()
data = [
EmotionSubGroup(
emotion_grp_id=row['emotion_grp'],
emotion_sub_group=row['emotion_sub_group'],
)
for index, row in row_iter
]
EmotionSubGroup.objects.bulk_create(data)
Можно ли создать общую структуру данных вместо жесткого кодирования имен полей, например:
data = `list_of_target_fields = rows_from_external_source`
чтобы быть эквивалентным тому, что я использую в настоящее время, и выполнить загрузку.
1 ответ
Вот простая функция, которая будет обновлятьForeignKey
и вернет экземпляр модели
def set_instance(data, model, foreignkeys=None):
if foreignkeys:
# update foreignkey in data dict
for k, v in foreignkeys.items():
data[v] = data.pop(k)
return model(**data)
def DataUpload (request):
# ...
# ...
df_rawdata = pd.read_csv(csv_file, sep=''). # Dataframe from source (.csv) file
row_iter = df_rawdata.iterrows()
foreignkey_fields = {'emotion_grp':'emotion_grp_id'}
data = [
set_instance(row, EmotionSubGroup, foreignkey_fields)
for index, row in row_iter
]
EmotionSubGroup.objects.bulk_create(data)
Другой подход, чтобы сделать код читабельным
def update_foreignkey(data, foreignkeys=None):
if foreignkeys:
# update foreignkey in data dict
for k, v in foreignkeys.items():
data[v] = data.pop(k)
return data
def DataUpload (request):
# ...
# ...
df_rawdata = pd.read_csv(csv_file, sep=''). # Dataframe from source (.csv) file
row_iter = df_rawdata.iterrows()
foreignkey_fields = {'emotion_grp':'emotion_grp_id'}
data = [
EmotionSubGroup(**update_foreignkey(row, foreignkey_fields))
for index, row in row_iter
]
EmotionSubGroup.objects.bulk_create(data)