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)
Другие вопросы по тегам