2016-01-06 1 views
2

J'ai le modèle et le gestionnaire suivants.Erreur lors du chargement des données de l'appareil

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 

Mon fichier appareil est donné ci-dessous

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

J'ai plus tôt les données jetai dans un fichier de montage. Mais quand je suis en train de charger l'appareil maintenant, je reçois l'erreur suivante ...

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 

Répondre

2

La méthode natural_key doit retourner un tuple, pas une chaîne.

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

Si natural_key est une chaîne "Andaman and Nicobar" au lieu d'un tuple ('Andaman and Nicobar',) alors *natural_key va déballer chacun des 19 caractères dans la chaîne comme argument séparé. Avec self, cela vous donne 20 arguments de votre message d'erreur.

+0

oui, mais nous avons une erreur différente ici: 'get_by_natural_key() prend 2 arguments positionnels mais 20 ont été donnés'' –

+0

@ArashHatami Pourquoi pensez-vous que c'est une erreur différente? Erreur – Alasdair

+0

est de prendre des arguments ne pas retourner la valeur pour une deuxième variable –