Django:"post initial migration" 的信号
Django: Signal for "post initial migration"
为了设置新的开发系统,我想要一个 "post initial migration" 信号。
好像还没有这样的东西
详细说明:我想要一个在初始迁移 运行 之后 运行 的信号。第二次调用 "manage.py migrate" 不应发出此信号。
用例:我想设置基本数据(添加一些用户和组,为 "example.com" 添加一些虚拟数据,...)。
我不想为此使用迁移,因为在迁移中我只有 apps.get_model("myapp", "Country")
返回的有限模型。
固定装置也一样:我不想使用固定装置,因为如果我有真正的 ORM 模型,我完成任务的痛苦就会少得多。
有没有办法解决这个问题?
您可以使用 post_migrate
信号。检查您的虚拟数据是否已创建(例如 if User.objects.exists():
),如果已创建则停止。
@Alasdair 关于 post-migrate
signal 的建议听起来不错,但我还是要加两分钱。
在过去需要初始数据(例如超级用户和一些基本配置数据)的情况下,我使用 custom admin command 来确保存在一些初始数据。在那些情况下,固定装置并没有完全达到我的需要。
此管理命令必须是幂等的,因为它仅在尚未达到所需状态时才进行更改。
例如,我的 ensure_auth_data
命令看起来像这样:
class Command(BaseCommand):
help = 'Creates superuser, permissions and groups.'
def _ensure_superuser(self):
u_created = False
u_updated = False
try:
usr = User.objects.get(username='ralf')
except User.DoesNotExist:
usr = User()
usr.username = 'ralf'
u_created = True
if not usr.is_active:
usr.is_active = True
u_updated = True
if not usr.is_superuser:
usr.is_superuser = True
u_updated = True
if u_created or u_updated:
usr.save()
if u_created:
self.stdout.write('Created superuser "{}"'.format(usr.username))
elif u_updated:
self.stdout.write('Updated superuser "{}"'.format(usr.username))
else:
self.stdout.write('Superuser "{}" already up to date'.format(usr.username))
def _ensure_permissions(self):
# create some special permissions if they're not present
def _ensure_groups(self):
# create some special groups and assign them permissions
def handle(self, *args, **options):
self.stdout.write('Starting command')
self.stdout.write('...')
self._ensure_superuser()
self.stdout.write('...')
self._ensure_permissions()
self.stdout.write('...')
self._ensure_groups()
self.stdout.write('...')
self.stdout.write('Command finished')
为了设置新的开发系统,我想要一个 "post initial migration" 信号。
好像还没有这样的东西
详细说明:我想要一个在初始迁移 运行 之后 运行 的信号。第二次调用 "manage.py migrate" 不应发出此信号。
用例:我想设置基本数据(添加一些用户和组,为 "example.com" 添加一些虚拟数据,...)。
我不想为此使用迁移,因为在迁移中我只有 apps.get_model("myapp", "Country")
返回的有限模型。
固定装置也一样:我不想使用固定装置,因为如果我有真正的 ORM 模型,我完成任务的痛苦就会少得多。
有没有办法解决这个问题?
您可以使用 post_migrate
信号。检查您的虚拟数据是否已创建(例如 if User.objects.exists():
),如果已创建则停止。
@Alasdair 关于 post-migrate
signal 的建议听起来不错,但我还是要加两分钱。
在过去需要初始数据(例如超级用户和一些基本配置数据)的情况下,我使用 custom admin command 来确保存在一些初始数据。在那些情况下,固定装置并没有完全达到我的需要。
此管理命令必须是幂等的,因为它仅在尚未达到所需状态时才进行更改。
例如,我的 ensure_auth_data
命令看起来像这样:
class Command(BaseCommand):
help = 'Creates superuser, permissions and groups.'
def _ensure_superuser(self):
u_created = False
u_updated = False
try:
usr = User.objects.get(username='ralf')
except User.DoesNotExist:
usr = User()
usr.username = 'ralf'
u_created = True
if not usr.is_active:
usr.is_active = True
u_updated = True
if not usr.is_superuser:
usr.is_superuser = True
u_updated = True
if u_created or u_updated:
usr.save()
if u_created:
self.stdout.write('Created superuser "{}"'.format(usr.username))
elif u_updated:
self.stdout.write('Updated superuser "{}"'.format(usr.username))
else:
self.stdout.write('Superuser "{}" already up to date'.format(usr.username))
def _ensure_permissions(self):
# create some special permissions if they're not present
def _ensure_groups(self):
# create some special groups and assign them permissions
def handle(self, *args, **options):
self.stdout.write('Starting command')
self.stdout.write('...')
self._ensure_superuser()
self.stdout.write('...')
self._ensure_permissions()
self.stdout.write('...')
self._ensure_groups()
self.stdout.write('...')
self.stdout.write('Command finished')