gpt4 book ai didi

django - 获取模型的历史版本

转载 作者:行者123 更新时间:2023-12-03 17:38:27 26 4
gpt4 key购买 nike

我正在使用 Django 1.10,我有两个这样的模型:

class Model1:
name = models.CharField()

class Model2:
model1 = models.ForeignKey(Model1, default=get_default_model1)
get_default_model1函数必须获得 Model1 的特定实例(例如,具有特定名称)或创建它,如果它不存在。问题是这个函数导入了 Model1并且还将用于迁移:这意味着这种迁移可能会在 Model1 时中断。被修改是因为它会导入新版本的 Model1而不是当时需要的版本(参见 here 以获得对该问题的更好解释)。

当做 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

但在某些迁移中,它会因 django.db.migrations.exceptions.NodeNotFoundError: Node ('default', '0004_auto_20160423_0400') not a valid node 而失败.它似乎与第三方依赖项的替换迁移有关。

有没有更好的方法来获取我的模型的历史版本或完成我在这里尝试做的事情?

最佳答案

您可以定义get_default_model1功能为:

def get_default_model1(Model1):
default_model = Model1.objects.get(...)

return lambda: default_model


class Model1:
name = models.CharField()


class Model2:
model1 = models.ForeignKey(Model1, default=get_default_model1(Model1))

然后在迁移中使用它:
Model1 = apps.get_model("<your_app>", "Model1")
Model2 = apps.get_model("<your_app>", "Model2")

for model2 in Model2.objects.all():
if not model2.model1:
model2.model1 = get_default_model1(Model1)

我知道这看起来不是最漂亮的,尤其是您必须手动设置默认值的部分,但是您将正确的模型注入(inject)到函数中,这样就实现了您的目标。

关于django - 获取模型的历史版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42566443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com