Как экспортировать данные в CSV-файл из нескольких django моделей? - PullRequest
1 голос
/ 22 апреля 2020

из django .db импорт моделей

Models.py

    class Musician(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        instrument = models.CharField(max_length=100)

    class Album(models.Model):
        artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
        name = models.CharField(max_length=100)
        release_date = models.DateField()
        num_stars = models.IntegerField()

  class Runner(models.Model):
    MedalType = models.TextChoices('MedalType', 'GOLD SILVER BRONZE')
    name = models.CharField(max_length=60)
    medal = models.CharField(blank=True, choices=MedalType.choices, max_length=10)
    artist1 = models.ForeignKey(Album, on_delete=models.CASCADE)

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

1 Ответ

0 голосов
/ 22 апреля 2020

Я думаю, вы можете попробовать вот так:

import csv

runner_fields = [x.name for x in Runner._meta.concrete_fields]
album_fields = ['artist1__{}'.format(x.name) for x in Album._meta.concrete_fields]
musician_fields = ['artist1__artist__{}'.format(x.name) for x in Musician._meta.concrete_fields]

all_fields = runner_fields + album_fields + musician_fields
runner_list = list(Runner.objects.values_list(*all_fields))

with open(..., 'w', newline='') as myfile:
     for _list in runner_list:
         wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
         wr.writerow(_list)

Объяснение

Здесь я получаю имена полей из моделей по _meta.concrete_fields. Затем я сложил все поля модели и передал его в качестве аргумента Runner модели values_list. Он вернет список списков. Наконец, использовал этот список списков для записи в файл CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...