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
...
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
Avez-vous déjà renseigné les champs Forskningsresultater et user et les ID et vous importez simplement la jointure des objets existants dans PersonRes? –
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 –