如何在django中创建自定义数据源?

时间:2012-04-10 13:55:56

标签: python 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。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

可能很难让内置管理员使用外部非SQL“数据库”(除非您编写自定义数据库后端,可能使用django-nonrel,或者使管理员像返回的对象实现管理员想要以like okm suggests)方式使用的所有方法。

你可能会破解它,但我敢打赌你的时间会更好地用于adding a custom view进口。您可以从管理模板继承,使其看起来与管理网站的其他部分非常相似。

答案 1 :(得分:1)

您可以通过

模拟评估的QuerySet
qs = Movie.objects.get_queryset()
qs._result_cache = map(lambda x: Movie(*x),
     [(1, 'The Godfather', '175'), ...])

并在管理员更改列表中显示。但是,您必须破解QuerySet方法并禁用管理操作(如过滤器)以防止额外的实际数据库查询。

为简单起见,为什么不将数据同步到本地数据库并将其存储在具有“admin picked”等值的额外状态字段中? 或者您可以将数据放在另一个表中并将拾取的内容同步到电影表。

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

答案 2 :(得分:0)

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

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

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