我正在使用Django 1.10,我有两个这样的模型:
class Model1:
name = models.CharField()
class Model2:
model1 = models.ForeignKey(Model1, default=get_default_model1)
Run Code Online (Sandbox Code Playgroud)
该get_default_model1函数必须获取特定实例Model1(例如,具有特定名称),或者如果它不存在则创建它.问题是这个函数导入Model1并且也将用于迁移:这意味着这样的迁移可能会在Model1修改时中断,因为它将导入新版本Model1而不是当时需要的版本(请参阅此处以获得更好的解释这个问题).
RunPython在迁移中执行操作时,您可以通过apps参数访问模型的历史版本,但情况并非如此.
我编写了以下代码来手动创建我的模型的历史版本:
from django.db import models, connection
from django.db.migrations.loader import MigrationLoader
def get_default_model1():
loader = MigrationLoader(connection)
apps = loader.project_state(list(loader.applied_migrations)).apps
Model1 = apps.get_model('app', 'Model1')
return Model1.objects.get_or_create(
name=settings.DEFAULT_NAME,
defaults={'name': settings.DEFAULT_NAME}
)[0].pk
Run Code Online (Sandbox Code Playgroud)
但是在一些迁移中,它失败了django.db.migrations.exceptions.NodeNotFoundError: Node ('default', '0004_auto_20160423_0400') not a valid node.它似乎与替换第三方依赖的迁移有关.
有没有更好的方法来获得我的模型的历史版本或完成我在这里尝试做的事情?
我试图实现与分类汇总表所示这里,但 要么该代码不适用于最新的 Pandas 版本 (0.18.1),要么示例错误用于多列而不是一列。我这里的代码导致下表
2014 2015 2016
project__name person__username activity__name issue__subject
Influenster employee1 Development 161.0 122.0 104.0
Fix bug 22.0 0.0 0.0
Refactor view 0.0 7.0 0.0
Quality assurance 172.0 158.0 161.0
employee2 Development 119.0 137.0 155.0
Quality assurance 193.0 186.0 205.0
employee3 Development Refactor view 0.0 0.0 1.0
Profit tools employee1 Development 177.0 136.0 216.0
Quality assurance 162.0 122.0 182.0
employee2 Development 154.0 168.0 124.0
Quality assurance 130.0 183.0 192.0
Fix bug 22.0 …Run Code Online (Sandbox Code Playgroud) 在elixir中,我们必须spawn/1生成一个没有任何参数的匿名函数,并spawn/3使用参数生成一个完全限定的函数.但是,如何生成需要参数的匿名函数?
示例:我想运行一个匿名函数来接收消息,直到满足某个条件.参数是函数本身能够执行递归步骤.
loop = fn f ->
receive do
{:end, pid} -> send(pid, "exiting")
{_, pid} ->
send(pid, "unrecognized message, keep waiting...")
f.(f)
end
end
child = spawn() # How do I spawn it passing itself as an argument?
Run Code Online (Sandbox Code Playgroud)