python - django_address 模块是否提供了一种播种初始国家数据的方法?
问题描述
我正在使用 Django 2.0、Python 3.7 和 MySql 5。我最近安装了 django_address 模块。我注意到当我基于我的 models.py 文件运行我的初始迁移时......
from django.db import models
from address.models import AddressField
from phonenumber_field.modelfields import PhoneNumberField
class CoopType(models.Model):
name = models.CharField(max_length=200, null=False)
class Meta:
unique_together = ("name",)
class Coop(models.Model):
type = models.ForeignKey(CoopType, on_delete=None)
address = AddressField(on_delete=models.CASCADE)
enabled = models.BooleanField(default=True, null=False)
phone = PhoneNumberField(null=True)
email = models.EmailField(null=True)
web_site = models.TextField()
它创建了一些地址表,包括...
mysql> show create table address_country;
+-----------------+---------------------------------------------------+
| Table | Create Table |
+-----------------+---------------------------------------------------+
| address_country | CREATE TABLE `address_country` ( |
| | `id` int(11) NOT NULL AUTO_INCREMENT, |
| | `name` varchar(40) COLLATE utf8_bin NOT NULL, |
| | `code` varchar(2) COLLATE utf8_bin NOT NULL, |
| | PRIMARY KEY (`id`), |
| | UNIQUE KEY `name` (`name`) |
| | ) ENGINE=InnoDB |
| | DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-----------------+---------------------------------------------------+
但是,此表中没有数据。有没有办法获取模块生成的表的种子数据,还是我需要自己挖掘?
解决方案
您可以使用pycountry
package很容易地自己生成国家/地区。
由于创建code
的模型字段Country
的最大长度为两个字符,因此您需要使用该alpha_2
代码。
我通常对这类事情使用自定义管理命令。也许添加一个检查以查看是否已经创建了任何对象,然后根据需要进行处理。
从外壳使用python manage.py create_countries
from address.models import Country
from pycountry import countries
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Initialize Country model'
def handle(self, *args, **kwargs):
create_countries = [
Country(name=country.name[:40], code=country.alpha_2)
for country in countries
]
Country.objects.bulk_create(create_countries)
self.stdout.write(f'Created {len(countries)} countries.\n')
如果生产服务器没有运行 Python/Django,那么您可以使用pycountry
创建包含相关数据的 CSV 文件。假设您使用的是 PostgreSQL,那么您可以使用该COPY FROM
命令来填充数据库。
import csv
from pycountry import countries
with open('countries.csv', mode='w') as countries_file:
# specify delimiter because some countries have a comma
writer = csv.writer(countries_file, delimiter='\t')
writer.writerow(['id', 'name', 'code'])
writer.writerows([
[index + 1, country.name, country.alpha_2]
for index, country in enumerate(countries)
])
推荐阅读
- javascript - 我需要添加什么以及将 JWT 令牌发送到浏览器标头的位置?
- php - PHP拆分和排序新数组中的数据
- python - 余弦相似度为 -1 或 1,但我需要将它们赌为 0 和 1
- selenium - 在 Selenium 中实现数组元素
- amazon-web-services - 我不完全理解容器化如何不会导致从一开始就过度配置实例
- php - Twilio whatsapp api电话号码的问题
- discord - 检查特定用户是否对 discord.py 做出反应
- javascript - 排序和合并对象列表
- angular - 如何定制
颜色? - bash - 使用 Cloud Build 重启 GCE 实例上的服务