首页 > 解决方案 > Django使用非数据库字段创建客户管理视图

问题描述

我想创建一个客户管理视图,其中包含我手动填写的数据字段,这意味着后面没有数据库表。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 正在数据库中查找表,但在我的模型中,我只需要手动填写数据的字段

标签: pythondjangodjango-models

解决方案


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

可能具有不映射到数据库表的模型属性。例如,您可以使用 a@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 等不那么单一和不那么固执己见的框架可能会更好地解决这个项目。


推荐阅读