Импорт данных из CSV-файла с многими полями в Python

Я хотел бы иметь возможность импортировать данные в мою базу данных из CSV-файла благодаря библиотеке Pandas, мне это удалось для некоторых данных модели, но когда полей модели много, я не могу.

Вот модель, данные которой я хотел бы импортировать:

class LnkPlantPlant(models.Model):
    class MAGNET_CHOICES(models.TextChoices):
        NONE = None
        IDEAL = 'ideal',
        GOOD = 'good',
        MEDIOCRE = 'mediocre',
        BAD = 'bad'

    custom_id = models.IntegerField(primary_key=True, unique=True)
    plant = models.ManyToManyField('perma_plants.Plant', related_name='%(class)s_plant')
    plant_associated = models.ManyToManyField('perma_plants.Plant', related_name='%(class)s_plant_associated')
    link = models.CharField(max_length=10, choices=MAGNET_CHOICES.choices, default=MAGNET_CHOICES.NONE, blank=True,
                            null=True)
    description = RichTextField(max_length=255, blank=True, null=True)

Вот модель plant:

class Plant(models.Model):

    name = models.CharField(max_length=150)

    def __str__(self):
        return self.name

Вот моя функция, которая позволяет импортировать данные в базу данных, но я хотел бы иметь возможность импортировать имена многих-многих полей plant и plant_associated:

class UploadLinkPlantData(generics.CreateAPIView):
    serializer_class = FileUploadSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        file = serializer.validated_data['file']
        reader = pd.read_csv(file)
        for _, row in reader.iterrows():
            LnkPlantPlant.objects.update_or_create(
                custom_id=row['Custom Id'],
                defaults={
                    "custom_id": row['Custom Id'],
                    "plant": Plant.objects.get(name=row['Plant']), # doesn't work
                    "plant_associated": Plant.objects.get(name=row['Plant associated']), # doesn't work
                    "link": row['Link'],
                    "description": row['Description']
                })
        return Response({"status": "Succès : plante(s) crée(s) ou mise(s) à jour."},
                        status.HTTP_201_CREATED)

Спасибо за помощь!

Внутри цикла

            lnk_plant, created = LnkPlantPlant.objects.update_or_create(
                custom_id=row['Custom Id'],
                defaults={
                    "custom_id": row['Custom Id'],
                    "link": row['Link'],
                    "description": row['Description']
                })
            plants =  Plant.objects.filter(name=row['Plant'])
            plant_associated = Plant.objects.filter(name=row['Plant associated'])
            lnk_plant.plant.set(list(plants))
            lnk_plant.plant_associated.set(list(plant_associated))

Обратите внимание, что set сотрет существующие m2m отношения.

Вы можете использовать add для добавления к отношению следующим образом:

lnk_plant.plant.add(*plants)
lnk_plant.plant_associated.add(*plant_associated)

Если вам также нужно создать объекты Plant, вам придется сделать это тоже раньше.

plant = Plant.objects.create(name=row['Plant'])
lnk_plant.plant.add(plant)
Вернуться на верх