Итак, если ваш models.py
выглядит примерно так:
class Representative(models.Model):
parliament = models.CharField(max_length=128)
name = models.CharField(max_length=128)
country = models.CharField(max_length=128)
party_group = models.CharField(max_length=128)
national_party = models.CharField(max_length=128)
position = models.CharField(max_length=128)
Затем вы можете запустить python manage.py shell
и выполнить следующее:
import csv
from your_app.models import Representative
# If you're using different field names, change this list accordingly.
# The order must also match the column order in the CSV file.
fields = ['parliament', 'name', 'country', 'party_group', 'national_party', 'position']
for row in csv.reader(open('your_file.csv')):
Representative.objects.create(**dict(zip(fields, row)))
И все готово.
Приложение (правка)
По просьбе Томаса, вот объяснение того, что делает **dict(zip(fields,row))
:
Итак, изначально fields
содержит список имен полей, которые мы определили, а row
содержит список значений, представляющих текущую строку в файле CSV.
fields = ['parliament', 'name', 'country', ...]
row = ['7', 'Marta Andreasen', 'United Kingdom', ...]
Что делает zip()
, так это объединяет два списка в один список пар элементов из обоих списков (например, молнию); то есть zip(['a','b,'c'], ['A','B','C'])
вернет [('a','A'), ('b','B'), ('c','C')]
. Итак, в нашем случае:
>>> zip(fields, row)
[('parliament', '7'), ('name', 'Marta Andreasen'), ('country', 'United Kingdom'), ...]
Функция dict()
просто преобразует список пар в словарь.
>>> dict(zip(fields, row))
{'parliament': '7', 'name': 'Marta Andreasen', 'country': 'United Kingdom', ...}
**
- это способ преобразования словаря в список аргументов ключевого слова для функции. Так что function(**{'key': 'value'})
является эквивалентом function(key='value')
. Итак, в нашем примере вызов create(**dict(zip(field, row)))
эквивалентен:
create(parliament='7', name='Marta Andreasen', country='United Kingdom', ...)
Надеюсь, это прояснит ситуацию.