2017-07-19 41 views
0

使用Django導入/導出,我有問題將外鍵字段導入到我的Django模型。具體而言,我在我的模型中有三個要導入的字段(第四個參與者 - 具有默認值,因此我們可以忽略該字段),其中一個是IntegerField,另外兩個是ForeignKey字段。Django導入/導出:ForeignKey字段返回無

導入前,所有三個字段都轉換爲數字格式。然而,ForeignKey領域無法讀取這些值,而是導入NaN(大概是因爲我已經把這些模型領域null=True

我已經試過類似的問題的解決方案的多,但他們並沒有解決這個問題。

我在做什麼錯在這裏?

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 

當打印dataset,我得到以下(表明的dataset只有一個實例):

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

然而,當我打印模式,採用pd.DataFrame.from_records(PersonRes.objects.all().values()),我得到:

 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 
... 

回答

0

列名應如下(刪除_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

我已經試過了。爲了以防萬一,我再次做了它,但它仍在兩個ForeignKey字段上都返回None。你有什麼可能是我的代碼錯誤的建議嗎? – Christian

+0

您是否已經安裝了Forskningsresultater和用戶字段和ID,並且您只是在PersonRes中導入現有對象的聯合? –

+0

你確定你的列標題也是你的文件中的用戶和forskningsresultater?你也設置標題爲_id –