2012-04-10 4 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にオブジェクトのリストを渡します。何か案は?

+1

あなたの要望:新しいモデルクラスは、おそらくは読み取り専用の外部データベースでバックエンドとして実装されています。また、メインのデータベースにムービーをインポートしたいと思っていますか? 'Movie'クラスの中に別の' ImportManager'を持つことは、あなたが望むもの、 'Movie.import_objects'またはそれに類するものである可能性が高いようです。 –

+0

@ChrisMorgan、はい、これは私がしたいことです。しかし、 'Movie'に' ImportManager'を持っていれば、管理パネルに別途インポートのリストを表示することはできません。問題は、この可能なインポートを管理者に表示することであり、インポート自体ではありません。 – Andrew

答えて

3

カスタムDBバックエンドを作成しない限り(おそらくdjango-nonrelを使用しないかぎり、組み込みの管理者が外部の非SQL「データベース」を使用するのは難しいでしょう)管理者が使用したいすべてのメソッドを実装しています(like okm suggests)。

は、あなたはそれをハックすることができるかもしれないが、私はあなたの時間をより良いだけadding a custom view輸入を行うために費やされる賭けます。管理テンプレートを継承して、管理サイトの他の部分とよく似ているようにすることができます。

+0

ありがとう、カスタムビューを構築する方がはるかに簡単であることが分かります。 – Andrew

0

自分のマネージャーをやっているようです。あなたのマネージャーの方法でやらなければならないことは、データベースへのいくつかの特別な質問です。

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

ここでは、カスタムマネージャのためのいくつかのメソッドを作成する方法の例をいくつか持っています。 このヘルプが必要です。

+0

ありがとう、マネージャーのドキュメントを読んだことがありますが、実際には「データベース」が存在しないため、役に立たないのです。私は、サードパーティのサービスを使用して、可能なインポートの一覧を取得します。 – Andrew

+0

はい、データベースがあります。このhttps://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methodsを参照すると、with_countsメソッドは、カスタムクエリを使用してデータベース情報を取得します。私はあなたを理解していないと思う – nicowernli

1

あなたは

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

によって評価クエリセットを模擬し、管理チェンジでそれを示すことができました。ただし、実際のDBクエリを防ぐために、QuerySetメソッドをハックし、フィルタなどの管理操作を無効にする必要があります。簡単にするために

、なぜ単にローカルDBにデータを同期して、そのような「管理者が選んだ」としての価値を持っている余分な状態フィールド/ wを保管していませんか?
また、別のテーブルにデータを配置し、選択したデータをムービーテーブルに同期させることもできます。

別のストレートな方法は、チェンジしたり、カスタマイズされたビュー内のムービーカテゴリと他の可能なメタ条件によってピックアップ/フィルタにスタッフを許可し、後でセロリタスクの[ムービー情報の同期を実行することです。

関連する問題