如何以编程方式在 Django 中创建数据库视图?

Posted

技术标签:

【中文标题】如何以编程方式在 Django 中创建数据库视图?【英文标题】:How to programatically create a database view in Django? 【发布时间】:2021-06-25 09:57:45 【问题描述】:

我运行以下查询以在我的 SQLite 数据库中创建数据库视图:

CREATE VIEW customerview AS
SELECT
    a.id
  , name
  , email
  , vat
  , street
  , number
  , postal
  , city
  , country
  , geo_lat
  , geo_lon
  , customer_id
  , is_primary
FROM customerbin_address a
  , customerbin_customer b
WHERE b.id = a.customer_id
  AND a.is_primary = 1

在 models.py 我添加了模型:

class Customerview(models.Model):
    name = models.CharField(max_length=100, db_column='name')
    email = models.EmailField(unique=True, db_column='email')
    vat = VATNumberField(countries=['NL', 'BE', 'FR', 'DE', 'UK'], blank=True, null=True, db_column='vat')
    street = models.CharField(max_length=100, db_column='street')
    number = models.IntegerField(null=True, db_column='number')
    postal = models.IntegerField(null=True, db_column='postal')
    city = models.CharField(max_length=100, db_column='city')
    country = CountryField(db_column='country')
    is_primary = models.BooleanField(null=False, db_column='is_primary')
    geo_lat = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True, db_column='geo_lat')
    geo_lon = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True, db_column='geo_lon')

    class Meta:
            managed = False
            db_table = 'customerview'

在 admin.py 中我更改了列表:

@admin.register(models.Customerview)
class CustomerviewAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'vat', 'street', 'number', 'postal', 'city', 'country', 'is_primary', 'geo_lat', 'geo_lon')
    readonly_fields = ('name', 'email', 'vat', 'street', 'number', 'postal', 'city', 'country', 'is_primary', 'geo_lat', 'geo_lon',)

如何以编程方式在我的应用程序中添加带有上述查询的数据库视图?

【问题讨论】:

docs.djangoproject.com/en/3.1/ref/migration-operations/… 如果你有managed = False,这意味着你不能从你的models.py修改表,包括创建索引。 @iklinac 如何在 models.py 中执行此操作?我有两个不同的模型(客户、地址),模型 Customerview 是一个将客户和地址模型与 WHERE 语句相结合的模型。我只需要一个方法,我可以从我的代码中创建一个数据库视图。 @MichielB 这并不是要被更改,它只是为了在该模型中显示查询,然后将其导出到 xlsx 或 csv。 【参考方案1】:

也许你应该用 get_view_str 方法https://pypi.org/project/django-database-view/#description试试这个

【讨论】:

你能展示一下它是如何工作的吗? 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review【参考方案2】:

Django 的迁移框架允许您执行原始 SQL - https://docs.djangoproject.com/en/3.1/ref/migration-operations/#runsql

因此,您可以创建一个空迁移 (manage.py makemigrations <appname> --empty),然后通过 migrations.RunSQL() 调用对其进行编辑以执行创建视图的 SQL。

【讨论】:

这也是我可以与我的代码集成的东西吗?如果我将代码发送给另一个开发人员,他/她应该可以只使用“pip install requirements.txt”并让应用程序启动并运行,而无需使用命令来执行查询。 如果您将其添加为迁移文件,它将应用于开发人员运行 manage.py migrate 的任何数据库,因此您团队中的每个人都可以自动设置相同的视图 - 这就是部分原因迁移是为了:一种在项目的多个用户之间定义可复制数据库状态的方法:thumbsup: 如果您说其他开发人员可能无法手动运行迁移,而您需要通过 setup.py 自动执行...这可能是可能的。请参阅***.com/questions/20288711/… - 虽然我还没有尝试过这个 谢谢,看来我需要更深入地了解迁移(Django 和 Python 对我来说通常是非常新的)。欣赏答案。

以上是关于如何以编程方式在 Django 中创建数据库视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在UIScrollview中创建UIScrollview

如何在具有自动布局的 Interface Builder 中创建的现有视图中添加视图?

如何以编程方式创建展开转场[重复]

如何以编程方式在 iphone 中创建图表

如何以编程方式在 WordPress 中创建帖子 [关闭]

如何以编程方式在 iOS 中创建 PDF?