Python 使用父类的Django 1.7迁移
我正在使用django 1.7编写一个迁移,我读了一些关于它的文章,但我不明白如何使用一个层次结构,比如在de模型中,country__name='MEXICO',并返回一个MX键,使用这个值我可以插入到表中,我想这是我的问题Python 使用父类的Django 1.7迁移,python,django,migration,Python,Django,Migration,我正在使用django 1.7编写一个迁移,我读了一些关于它的文章,但我不明白如何使用一个层次结构,比如在de模型中,country__name='MEXICO',并返回一个MX键,使用这个值我可以插入到表中,我想这是我的问题 def add_holder_data(apps, schema_editor): table = 'PODER.DBF' m = MigrationFromDBase() fields = json.dumps(m.fetch_dbase_tab
def add_holder_data(apps, schema_editor):
table = 'PODER.DBF'
m = MigrationFromDBase()
fields = json.dumps(m.fetch_dbase_table(table))
Holder = apps.get_model('holder', 'Holder')
data = []
for f in json.loads(fields):
if int(f['NREFPOD']) > 0 and int(f['NREFPOD']) != None:
data.append(
Holder(
id=int(f['NREFPOD']), name =f['SOLICITA'], street = f['CALLE'], city = f['CIUDAD'],
cp = f['CODIGO'], country__name = f['PAIS'], nationality = f['NACION'], rfc = f['RFC'],
power = f['PODER_EN'], no_rgp = f['NORGP'], person_type = f['PERFISICA'],
national = f['NACIONAL'], compulsa = int(f['COMPULSA'])
)
)
Holder.objects.bulk_create(data)
def remove_holder_data(apps, schema_editor):
Holder = apps.get_model('holder', 'Holder')
Holder.objects.all().delete()
class Migration(migrations.Migration):
dependencies = [('holder','0001_initial')]
operations = [
migrations.RunPython(
add_holder_data,
reverse_code=remove_holder_data
),
]
如果我使用country=f['PAIS'],它会给我一个错误:值太长,无法改变类型字符(2),这是因为f['PAIS]有一个全名。该类在country.code字段中有四个字符
如果我使用country\u name=f['PAIS'],它会给我一个错误:TypeError:'country\u name'是此函数的无效关键字参数,在这种情况下,我不知道为什么会出现错误
我需要先得到国家代码
class Country(models.Model):
code = models.CharField(max_length=4, verbose_name=_('Código'))
name = models.CharField(max_length=80, verbose_name=_('Nombre'))
def __str__(self):
return self.name
这是持有人的定义:
class Holder(models.Model):
name = models.CharField(max_length=80, verbose_name=_('Nombre'))
street = models.CharField(max_length=70, blank=True, verbose_name=_('Calle'))
city = models.CharField(max_length=70, blank=True, verbose_name=_('Ciudad'))
cp = models.CharField(max_length=10, blank=True, verbose_name=_('Código Postal'))
country = models.CharField(Country, max_length=50)
nationality = models.CharField(Nacionality, blank=True, max_length=50)
rfc = models.CharField(max_length=13, blank=True, verbose_name=_('RFC'))
def __str__(self):
return self.name
解决这个问题的方法是,清理国家的数据,改变我的持有者模型
class Holder(models.Model):
name = models.CharField(max_length=100, verbose_name=_('Nombre'))
street = models.CharField(max_length=100, blank=True, verbose_name=_('Calle'))
city = models.CharField(max_length=100, blank=True, verbose_name=_('Ciudad'))
cp = models.CharField(max_length=10, blank=True, verbose_name=_('Código Postal'))
country = models.ForeignKey(Country)
nationality = models.CharField(Nacionality, blank=True, max_length=50)
rfc = models.CharField(max_length=13, blank=True, verbose_name=_('RFC'))
之后,它总是会出现一个错误,比如:必须是类别国家的对象,并在打印时发现它使用应用程序发送给我的对象\uuuuuuu fake\uuuuuu.Holder对象
。获取模型('app','class')
,但如果从Holder导入Holder导入类,它将打印Holder.Holder对象
,因此,我认为这两个对象将是相同类型的对象,以检索正确的国家/地区模型对象,这是我的迁移类
from addons.utility import MigrationFromDBase
import simplejson as json
from addons.tools import CapitalizeMultiplesWords, CleanEmptySpaceInWords, CleanUnicode, UniqueJson
def discover_country(instance, country):
"""
Cleaned the string to get the country city
:param country: is a country from dbase and it contains no normalized data
:return: Country Object
"""
obj = instance
if country.find('_n_') != -1:
_clean_country = CleanEmptySpaceInWords(str(CapitalizeMultiplesWords(country)))
else:
_clean_country = CleanUnicode(str(CleanEmptySpaceInWords(str(CapitalizeMultiplesWords(country)))))
try:
_country = obj.objects.get(name = _clean_country)
except obj.DoesNotExist:
_country = obj.objects.get(name = 'unknown')
return _country
def add_holder_data(apps, schema_editor):
table = 'TABLE.DBF'
m = MigrationFromDBase()
fields = json.dumps(m.fetch_dbase_table(table))
holder_instance = apps.get_model('holder', 'Holder')
country_instance = apps.get_model('addons', 'Country')
for f in UniqueJson(json.loads(fields), 'NREFPOD'):
if int(f['NREFPOD']) > 0 and int(f['NREFPOD']) != None:
if f['SOLICITA'].strip() == "" :
f['SOLICITA'] = 'unknown'
if f['PERFISICA'].strip() == "":
f['PERFISICA'] = ''
if f['NACIONAL'].strip() == "":
f['NACIONAL'] = ''
_country = discover_country(country_instance, f['PAIS'])
holder_instance.objects.get_or_create (
id=int(f['NREFPOD']), name = f['SOLICITA'], street = f['CALLE'], city = f['CIUDAD'],
cp = f['CODIGO'], country = _country, rfc = f['RFC'],
power = f['PODER_EN'], no_rgp = f['NORGP'], person_type = f['PERFISICA'],
national = f['NACIONAL'], compulsa = int(f['COMPULSA'])
)
def remove_holder_data(apps, schema_editor):
Holder = apps.get_model('holder', 'Holder')
Holder.objects.all().delete()
class Migration(migrations.Migration):
dependencies = [('holder','0001_initial')]
operations = [
migrations.RunPython(
add_holder_data,
reverse_code=remove_holder_data
),
]
你能粘贴持有者的定义吗?
Holder(…,country=country(code=…,name=f['PAIS']),…)
有效吗?