【问题标题】:Django 1.7 migrations using parent class使用父类的 Django 1.7 迁移
【发布时间】:2015-02-04 00:22:40
【问题描述】:

我正在使用 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_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__name = f['PAIS'] 它会给我一个错误:TypeError: 'country_name' is an invalid keyword argument for this function,在这种情况下,我不知道为什么会出错。

我需要先得到国家代码?

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

【问题讨论】:

  • 你能粘贴Holder的定义吗? Holder(..., country=Country(code=..., name=f['PAIS'])), ...) 有效吗?

标签: python django migration


【解决方案1】:

解决问题的方法是,清理国家/地区的数据,并更改我的持有人模型

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'))

在它总是得到一个错误之后,比如:必须是 Country 类的对象,并发现我在打印对象时使用 apps.get_model('app', 'class') 发送给我 __fake__.Holder object 但如果将类导入为 from holder import Holder它会打印 @987654325 @,所以我认为两者都是相同类型的对象来检索正确的 Country Model 对象,这是我的迁移类。

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
        ),
    ]

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 2014-05-28
    • 2014-11-19
    • 2015-10-31
    • 2015-02-09
    • 2014-12-21
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多