1

管理者がサードパーティのサービスからデータをインポートできるようにしたい。そのために、管理者パネルにインポートできるすべてのものをリストし、管理者が何をインポートするかを選択できるようにします。
これが私がやろうとしていることです:

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に渡すだけで可能です。何か案は?

4

3 に答える 3

3

ビルトイン管理者に外部の非 SQL「データベース」を操作させるのはおそらく難しいでしょう (おそらくdjango-nonrelを使用してカスタム DB バックエンドを作成するか、すべての実装を返すマネージャーのようなオブジェクトを作成しない限り)管理者がokm が提案するような方法で使用したい方法)。

ハッキングできるかもしれませんが、インポートを行うためのカスタム ビューを追加するだけで時間を費やす方がよいでしょう。管理テンプレートから継承して、管理サイトの残りの部分と非常によく似た外観にすることができます。

于 2012-04-10T15:30:36.270 に答える
1

評価された QuerySet をモックすることができます

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

そしてそれを管理変更リストに表示します。ただし、QuerySet メソッドをハックし、フィルターなどの管理操作を無効にして、余分な実際の DB クエリを防ぐ必要があります。

簡単にするために、データをローカル DB に同期し、「管理者が選択した」などの値を持つ追加の状態フィールドと共に保存しないのはなぜですか?
または、データを別のテーブルに入れて、選択したデータをムービー テーブルに同期することもできます。

もう 1 つの直接的な方法は、変更リストまたはカスタマイズされたビューで映画のカテゴリやその他の可能なメタ条件によってスタッフがピックアップ/フィルタリングし、後で Celery タスクで映画情報の同期を実行できるようにすることです。

于 2012-04-10T15:11:27.170 に答える
0

自分のマネージャーをやっているようです。マネージャーのメソッドで行う必要があるのは、データベースへの特別なクエリだけです。

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

ここでは、カスタム マネージャー用のメソッドを作成する方法の例をいくつか示します。この助けを願っています。

于 2012-04-10T14:10:54.713 に答える