django应用程序的动态初始数据固定装置

django-dynamic-initial-data的Python项目详细描述


Build Status

django初始数据

django动态初始数据是一个django>=1.6postgresql唯一的应用程序,它有助于解决使用 依赖项和其他条件数据。不是每个应用程序都有静态设备,而是初始数据 可以动态创建和更新。此外,django动态初始数据还处理对象 从初始数据中删除,这是django的初始数据fixture系统所缺少的特性。

目录

  1. [安装](安装)
  2. [简要概述](简要概述)
  3. [示例](示例)
  4. Handling Deletions

安装

安装django动态初始数据:

pip install django-dynamic-initial-data

将django动态初始数据添加到INSTALLED_APPS以开始:

settings.py

INSTALLED_APPS=('dynamic_initial_data',)

简要概述

提供了一个管理命令update_initial_data,该命令将尝试更新所有INSTALLED_APPS。这个 命令旨在作为应用程序部署过程的一部分调用。任何缺少的依赖项 将引发InitialDataMissingApp异常,并且任何循环依赖项都将引发 InitialDataCircularDependency异常。

任何需要定义初始数据的应用程序都需要一个名为initial_data.py的文件,该文件位于fixtures的内部 目录。这看起来像{app_name}/fixtures/initial_data.py。别忘了包括 fixtures目录中的__init__.py文件。initial_data.py必须定义一个类InitialData 继承自BaseInitialData

当初始化应用程序时,将实例化每个InitialData类并调用update_initial_data。 如果update_initial_data未实现,则将引发NotImplementedError

任何依赖项都应该包含在名为dependencies的列表中。每个依赖项都是一个字符串 在INSTALLED_APPS中定义的应用程序名称。

示例:

fromdynamic_initial_data.baseimportBaseInitialDataclassInitialData(BaseInitialData):dependencies=['my_first_app','my.second.app']defupdate_initial_data(self):model_obj,created=TestModel.objects.upsert(int_field=5,defaults={'float_field':2.0})TestModel.objects.bulk_upsert([TestModel(float_field=1.0,char_field='1',int_field=1),TestModel(float_field=2.0,char_field='2',int_field=2),TestModel(float_field=3.0,char_field='3',int_field=3),],['int_field'],['char_field'])

在本例中,将为my_first_app调用update_initial_data方法(首先跟踪任何依赖项)。 然后对于my.second.app,在最后对这个类调用update_initial_data之前。同样,可以通过调用

python manage.py update_initial_data

同样,要仅初始化单个应用程序,请使用

python manage.py update_initial_data --app 'app_path'

有关使用upsertbulk_upsert的文档如下:

处理删除

在django应用程序中指定初始数据的一个困难是无法将初始数据部署到项目中,然后再删除任何初始数据固定装置。如果删除一个初始的@data.json文件中的对象,django在下次部署时不会处理它的删除,这可能会导致延迟对象的问题。

django dynamic initial data通过允许用户执行以下任一操作来解决此问题:

  1. 从update_initial_data函数将所有托管初始数据对象作为数组返回。
  2. 使用register_for_deletion(*model_objs)方法显式注册要删除的对象。

请注意,每次都由用户负责注册每个对象,而不管该对象是由初始数据进程更新还是创建的。这样做允许django动态初始数据删除以前管理的任何对象。例如,假设您有一个initialdata类,它管理两个用户名为“hello”和“world”的用户。

fromdynamic_initial_data.baseimportBaseInitialDataclassInitialData(BaseInitialData):defupdate_initial_data(self):hello=Account.objects.get_or_create(name='hello')world=Account.objects.get_or_create(name='world')# register the accounts for deletionself.register_for_deletion(hello,world)

创建此代码后,初始数据进程现在拥有“hello”和“world”帐户对象。如果这些对象在代码的后续版本中没有注册以供删除,则在执行初始数据处理时,它们将被删除。例如,假设执行了第一段代码,然后用户执行了这段代码:

fromdynamic_initial_data.baseimportBaseInitialDataclassInitialData(BaseInitialData):defupdate_initial_data(self):world=Account.objects.get_or_create(name='world')# register the accounts for deletionself.register_for_deletion(world)

当这段代码执行时,先前的“hello”帐户将被删除,因为初始数据进程不再拥有它。而且别担心,如果它已经被另一个进程删除了,则删除不会引发错误。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Grid loadmask(true)在gxt中不起作用   java将字符串索引转换为整数   为什么Java泛型适用于基元数组,但不适用于基元数组?   java如何让Azure应用程序服务Tomcat将所有80/443流量转发到运行在同一应用程序服务上的JBoss   具有多个值的java转换映射到树?   java如何设置SQL server连接URL?   java设置了多个相互独立的JFrame   安全性在JAVA中如何使用RSAPrivateKey的密码短语?   java不能使用比Apache Velocity中更大的条件   如何在Java中打印字符串的所有排列   停止Android Studio自动导入java。sql。日期   对象简单计算器程序java   java如何在安卓中使用“&”符号作为字符串?   java Connect,为我的安卓应用程序从REST API发布和获取数据