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,或者创建一个类似管理器的对象返回实现所有管理员希望以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 方法并禁用过滤器等管理操作,以防止额外的真实数据库查询。

为简单起见,为什么不将数据同步到本地数据库并将它们存储在具有诸如“管理员选择”之类的值的额外状态字段中?
或者您可以将数据放在另一个表中并将选取的数据同步到电影表。

另一种直接的方法是允许工作人员在更改列表或您的自定义视图中按电影类别和其他可能的元条件进行拾取/过滤,并稍后在 Celery 任务中执行电影信息的同步。

于 2012-04-10T15:11:27.170 回答
0

看起来你正在做自己的经理。您在经理的方法中要做的只是对数据库的一些特殊查询。

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

这里有一些关于如何为自定义管理器创建一些方法的示例。希望这有帮助。

于 2012-04-10T14:10:54.713 回答