2012-04-10 67 views
1

我想讓管理員從第三方服務導入數據。爲此,我想列出管理面板中要導入的所有可能的東西,並允許管理員選擇要導入的內容。
這裏是我想要做的事:如何在django中創建自定義數據源?

class Movie(models.Model): 
    title = #... 
    length = #... 
    #... 

class ImportManager(models.Manager): 
    def all(self): 
     # what should go here? 

class MovieImporter(Movie): 
    objects = ImportManager() 

    class Meta: 
     proxy = True 
     verbose_name_plural = verbose_name = 'Import Movies' 

admin.site.register(Movie) 
admin.site.register(ImportMovie) 

我很困惑,我怎麼可以從ImportManager.all返回一個QuerySet如果沒有,即使數據庫和它不是從文件明確的是它可能只是將對象列表傳遞給QuerySet。有任何想法嗎?

+1

我對你想要的東西的總結:一個新的模型類用一個外部的,可能是隻讀的,「數據庫」作爲它的後端來實現。我也想象你想把電影導入你的主數據庫?在'Movie'類中有一個單獨的'ImportManager'在我看來更可能是你想要的 - Movie.import_objects或類似的。 – 2012-04-10 14:13:26

+0

@ChrisMorgan,是的,這是我想要做的。但是在'Movie'中使用'ImportManager'將不允許我在管理面板中單獨顯示可能的導入列表。問題在於向管理員顯示這種可能的輸入,而不是輸入本身。 – Andrew 2012-04-10 14:21:20

回答

3

可能很難讓內置管理員使用外部非SQL「數據庫」(除非您編寫自定義數據庫後端,可能使用django-nonrel,或者創建類似管理器的對象實現管理員想要以like okm suggests的方式使用的所有方法)。

您可能會破解它,但我敢打賭,您只需花費adding a custom view就可以完成進口。您可以從管理模板繼承,並使其看起來與管理網站的其他部分非常相似。

+0

謝謝,構建自定義視圖變得更簡單。 – Andrew 2012-04-10 20:13:21

0

看起來你正在做自己的經理。你必須在你的經理的方法中做什麼,只是一些特別的數據庫查詢。

https://docs.djangoproject.com/en/dev/topics/db/managers/

在這裏,你有你如何能創建一個自定義的管理的一些方法的一些例子。 希望得到這個幫助。

+0

謝謝,我已經閱讀過關於經理的文檔,他們根本沒有幫助,因爲實際上沒有「數據庫」。我使用第三方服務來檢索可能的進口清單。 – Andrew 2012-04-10 14:19:15

+0

但是,有一個數據庫。看看這個https://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methods,方法with_counts使用自定義查詢來檢索數據庫信息。我想我不理解你 – nicowernli 2012-04-10 15:16:25

1

您可以通過

qs = Movie.objects.get_queryset() 
qs._result_cache = map(lambda x: Movie(*x), 
    [(1, 'The Godfather', '175'), ...]) 

嘲笑的評估查詢集,它顯示了在管理員修改列表。但是,您必須破解QuerySet方法並禁用諸如過濾器的管理操作,以防止額外的真實DB查詢。

爲簡單起見,爲什麼不將數據同步到本地數據庫並將它們存儲爲具有諸如「管理員挑選」之類的值的額外狀態字段?
或者您可以將數據放入另一個表中,並將拾取的內容同步到電影表中。

另一個直接的方法是允許員工在更改列表或您的自定義視圖中按電影類別和其他可能的元條件進行拾取/過濾,並在稍後執行Celery任務中的電影信息同步。

相關問題