Django创建带有非数据库字段的自定义管理视图

2024-09-25 00:24:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class TestAdmin(admin.ModelAdmin):
    pass

admin.site.register(Test, TestAdmin)

在模型.py在

^{pr2}$

但是我收到了一个错误

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

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


Tags: py模型testregister视图数据库adminsite
2条回答

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管理类中的只读字段。如果getter逻辑需要从远程服务器同步获取数据,请注意在列表视图中使用它,因为这将是一个严重的性能瓶颈。在

如果您希望能够从django管理员为setter设置值,则必须为TestAdmin编写一个自定义的ModelForm。在

在这里可以说服Django做你想做的事。但是Django的模型和管理是基于ORM的,这意味着使用关系数据库作为持久存储。如果您不想这样做,您会发现自己经常与框架抗争并覆盖框架,而不是从Django的“电池包括在内”中获益。用一个不那么单一和不那么固执己见的框架来解决这个项目,比如Flask而不是Django。在

似乎您并没有真正了解Model和{}是什么。Model类是数据库表的表示,而ModelAdmin是为该表及其内容提供管理功能的组件。如果没有一个模型,你就不可能有一个模型。在

长话短说:你要么

1/使用模型或

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

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

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

实际上,即使您无法控制这些上传,出于上述原因,您可能仍然希望使用模型,并有一个后台任务(cron job或等效任务)从s3存储桶内容更新您的表(或者,如果s3提供web钩子,则在上传时有一个由s3调用的API端点来更新您的表)。在

相关问题 更多 >