Django使用非数据库字段创建自定义管理视图

时间:2018-05-09 08:18:13

标签: python django django-models

我想创建一个自定义管理视图,其中的字段包含我手动填充的数据,这意味着后面没有数据库表。 在我admin.py我到目前为止

class TestAdmin(admin.ModelAdmin):
    pass

admin.site.register(Test, TestAdmin)

和models.py

class Test(models.Model):
    test = models.BooleanField(
        default=True
    )

但是这样我收到错误

django.db.utils.ProgrammingError: relation "..._test" does not exist

Django在数据库中查找表,但在我的模型中,我只需要手动填充数据的字段

2 个答案:

答案 0 :(得分:0)

django的ORM的工作方式是作为model.Field实例的模型类的所有类成员都将映射到数据库中的列。

可以使模型属性不映射到数据库表。例如,您可以使用@property代替。

class Test(models.Model):

    @property
    def test(self):
        return get_aws_bucket_value(self.id)

    @test.setter
    def test(self, value):
        set_aws_bucket_value(self.id, value)

你必须自己实现aws getter / setter函数。

您可以在django admin类中将属性用作只读字段。如果getter逻辑需要同步从远程服务器获取数据,请注意在列表视图中使用它,因为这将是一个重要的性能瓶颈。

如果您希望能够从django admin设置setter的值,则必须为TestAdmin编写自定义ModelForm

有可能让Django在这里做你想做的事。但Django的模型和管理员基于ORM,这意味着使用关系数据库作为持久存储。如果你不想这样,你可以发现自己更多地反对和压倒框架,而不是从Django的“电池包含”中获益。这个项目可能更好地解决了一个不那么单一和不那么自以为是的框架,如Flask而不是Django。

答案 1 :(得分:0)

您似乎并没有真正得到ModelModelAdmin的内容。 Model类是数据库表的表示,ModelAdmin是为该表及其内容提供管理功能的组件。 IOW,当你写下“那里没有数据库表”时,你会忽略这一点:你不能拥有没有模型的ModelAdmin,而你没有没有数据库表的Model。 / p>

长话短说:你要么

1 /使用模型或

2 /自己编写整个视图和模板并将其插入管理员。

对于第二个解决方案,see this question (and it's answers),或只是谷歌搜索“没有模型的django管理员视图”(有一些第三方应用程序可以帮助在管理员中插入自定义视图)。

现在第一个解决方案可能 - 或者不是,取决于您的确切需求 - 与第二个解决方案一样好,具体取决于谁填充您的s3bucket以及如何填充。如果没有模型,您将不得不在每次有人访问自定义管理视图时查询存储桶以获取文件列表,这可能会非常昂贵。如果所有上传到s3存储桶都在您的控制之下,您可以使用模型来保存本地文件列表“缓存”,并且您只需要在有效下载文件时按s3。这也使您有机会存储有关这些文件的元数据 - 可用于搜索/过滤 - 并最终在需要时将您的s3文件链接到其他模型。当然,这意味着您可以免费获得管理员;)

实际上,即使您无法控制这些上传,您仍可能出于上述原因使用模型,并且具有后台任务(cron作业或等效任务),可以从s3存储桶内容更新您的表(或 - 如果s3提供了Web挂钩 - 在上传更新表时有一个由s3调用的API端点。)