2017-07-19 1 views
0

En utilisant Django Import/Export, j'ai des problèmes pour importer des champs clés étrangers dans mes modèles Django. Plus précisément, j'ai trois champs dans mon modèle que je veux importer (le quatrième-participant-ayant une valeur par défaut, de sorte que nous pouvons ignorer celui-ci), dont un est IntegerField et les deux autres sont ForeignKey champs.Exportation/exportation Django: les champs ForeignKey renvoient Aucun

Les trois champs sont convertis au format numérique avant l'importation. Cependant, les ForeignKey champs ne peuvent pas lire ces valeurs et au lieu d'importer NaN (probablement parce que j'ai mis ces champs de modèle à null=True.

J'ai essayé plusieurs des solutions sur des questions similaires, mais ils ne sont pas résoudre ce problème.

Qu'est-ce que je fais mal ici?

models.py

class User(auth.models.User,auth.models.PermissionsMixin): 
    def __str__(self): 
     return "@{}".format(self.username) 

class Forskningsresultater(models.Model): 
    id = models.IntegerField(primary_key=True) 
    authors = models.ManyToManyField(settings.AUTH_USER_MODEL, through='PersonRes', blank=True,related_name='authors',verbose_name="Authors") 
    ... (plus irrelevant fields for this question) 

class PersonRes(models.Model): 
    id = models.IntegerField(primary_key=True) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,verbose_name="user") 
    forskningsresultater = models.ForeignKey(Forskningsresultater,on_delete=models.CASCADE, null=True,verbose_name="forskningsresultater") 
    participant = models.BooleanField(default=True) 
    def __str__(self): 
     return "{}. Result {}: {}".format(self.id,self.forskningsresultater, self.user) 

admin.py

from import_export import widgets, fields, resources 
class PersonResResource(resources.ModelResource): 
    user = fields.Field(column_name='user_id', attribute='user', widget=widgets.ForeignKeyWidget(settings.AUTH_USER_MODEL, 'id')) 
    forskningsresultater = fields.Field(column_name='forskningsresultater_id', attribute='forskningsresultater', widget=widgets.ForeignKeyWidget(Forskningsresultater, 'id')) 
    class Meta: 
     model = PersonRes 
     fields = ('id','user','forskningsresultater','participant',) 

from import_export.admin import ImportExportModelAdmin 
class PersonResAdmin(ImportExportModelAdmin): 
    class Meta: 
     resource_class: PersonResResource 
admin.site.register(PersonRes,PersonResAdmin) 

myscript.py

... 

df_persres[['A']] = df_persres[['A']].apply(pd.to_numeric) 
df_persres[['B']] = df_persres[['B']].apply(pd.to_numeric) 
df_persres[['C']] = df_persres[['C']].apply(pd.to_numeric) 

df_persres.columns =['id','user_id','forskningsresultater_id'] 

if(len(df_persres.index) != 0): 
    import tablib 
    from import_export import resources 
    from accounts.models import PersonRes 
    personres_resource = resources.modelresource_factory(model=PersonRes)() 
    antall = len(df_persres.index) 
    for row in range(antall): 
     dataset = tablib.Dataset([ df_persres.iat[row,0], 
            df_persres.iat[row,1], 
            df_persres.iat[row,2]], 
            headers=['id', 'user_id', 'forskningsresultater_id']) 
     result = personres_resource.import_data(dataset, dry_run=True) 
else: 
    pass 

Lors de l'impression dataset, je reçois le texte suivant (montrant qu'une seule instance de dataset):

id  |user_id|forskningsresultater_id 
---------|-------|----------------------- 
148097456|1480974|56 

Cependant, quand j'imprimer le modèle, en utilisant pd.DataFrame.from_records(PersonRes.objects.all().values()), Je reçois:

 forskningsresultater_id   id participant user_id 
0       NaN  338884   True  NaN 
1       NaN  566233   True  NaN 
2       NaN  636223   True  NaN 

3       NaN  754756   True  NaN 
4       NaN  802856   True  NaN 
5       NaN  1005256   True  NaN 
... 

Répondre

0

Les noms des colonnes doivent être comme suit (supprimer le _id):

user = fields.Field(column_name='user', attribute='user', widget=widgets.ForeignKeyWidget(settings.AUTH_USER_MODEL, 'id')) 
forskningsresultater = fields.Field(column_name='forskningsresultater', attribute='forskningsresultater', widget=widgets.ForeignKeyWidget(Forskningsresultater, 'id')) 
+0

J'ai déjà essayé. Je l'ai fait une fois de plus juste au cas où, mais il renvoie toujours None sur les deux champs ForeignKey. Avez-vous une autre suggestion sur ce qui pourrait être mauvais dans mon code? – Christian

+0

Avez-vous déjà renseigné les champs Forskningsresultater et user et les ID et vous importez simplement la jointure des objets existants dans PersonRes? –

+0

Etes-vous sûr que vos en-têtes de colonnes sont également utilisateur et forskningsresultater dans votre fichier? Vous avez également défini les en-têtes sur _id –