2016-01-06 50 views
2

加载数据我有以下型号和经理。下面错误而从夹具

[ 
    { 
     "model": "parties.state", 
     "fields": { 
      "name": "Andaman and Nicobar", 
      "code": "AN", 
      "country": "India" 
     } 
    }, 
    { 
     "model": "parties.state", 
     "fields": { 
      "name": "Andhra Pradesh", 
      "code": "AP", 
      "country": "India" 
     } 
    }, 
] 

我早甩数据到一个固定的文件

class StateManager(models.Manager): 
    def get_by_natural_key(self, name): 
     return self.get(name=name) 


class State(models.Model): 

    class Meta: 
     verbose_name = "State" 
     verbose_name_plural = "States" 
     permissions = (
      ('access_state', 'Can access States'), 
     ) 

    COUNTRIES = (
     ('India', 'India'), 
     ('USA', 'USA'), 
     ('Thailand', 'Thailand'), 
    ) 

    # Managers 
    objects = StateManager() 

    # Database fields 
    name = models.CharField(
     'Name', 
     max_length=100, 
     unique=True, 
     help_text=''' 
     100 chars max 
     ''' 
    ) 
    code = models.CharField(
     'Code', 
     max_length=10, 
     unique=True, 
     help_text=''' 
     10 chars max 
     ''', 
     null=True, blank=True 
    ) 
    country = models.CharField(
     max_length=50, 
     default="India", 
     choices=COUNTRIES, 
     blank=False, 
     null=False 
    ) 

    def __str__(self): 
     return self.name 

    def natural_key(self): 
     return self.name 

我fixture文件中给出。但是,当我试图立即加载夹具上,我收到以下错误......

Traceback (most recent call last): 
..... 
..... 
    TypeError: get_by_natural_key() takes 2 positional arguments but 20 were given 
..... 
..... 

    File "/home/parijath/Projects/virtualenv/django18/lib/python3.4/site-packages/django/core/serializers/base.py", line 195, in build_instance 
    obj.pk = Model._default_manager.db_manager(db).get_by_natural_key(*natural_key).pk 
django.core.serializers.base.DeserializationError: Problem installing fixture '/home/parijath/Projects/django_projects/webportal18_multipleapps/parties/fixtures/states.json': get_by_natural_key() takes 2 positional arguments but 20 were given 

回答

2

natural_key方法应该返回一个元组,而不是一个字符串。

def natural_key(self): 
    return (self.name,) 

natural_key如果是一个字符串"Andaman and Nicobar"代替的元组('Andaman and Nicobar',)然后*natural_key将解包每个19个字符的字符串作为单独的参数英寸与self一起,您可以从错误消息中获得20个参数。

+0

是的,但是我们这里有不同的错误:'get_by_natural_key()接受但20人given' –

+0

@ArashHatami 2个位置参数为什么你认为这是一个不同的错误? – Alasdair

+0

错误是关于取第二个变量的参数不返回值 –