【问题标题】:save() prohibited to prevent data loss due to unsaved related object Django 1.10save() 禁止以防止由于未保存的相关对象 Django 1.10 导致数据丢失
【发布时间】:2017-01-07 19:08:36
【问题描述】:

好的,所以经过一番搜索,据我所知,没有一个相关问题可以解决我的具体问题。我显然不明白他们是否这样做,所以对于任何冗余,我深表歉意。

这是我的回溯:

Traceback(最近一次调用最后一次): 文件“csvimport.py”,第 79 行,在 f.save() 文件“/home/blake/django_/venv/lib/python3.5/site->packages/django/db/models/base.py”,第 752 行,保存 “未保存的相关对象 '%s'。” % 字段名称 ValueError: save() 被禁止以防止由于未保存的相关 >object 'aircraft' 而导致数据丢失。

这是有问题的脚本:http://pastebin.com/Jks0HgEr

这些是我的模型:http://pastebin.com/uGUqckqS

我不知道为什么函数 assignAircraft() 在第 56 行调用时没有保存 Aircraft.aircraft_type 对象

奇怪的是,row[1] 的第一个实例被保存到飞机模型中。

此外,欢迎任何改进/pep8 建议。

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

    我想指出你函数的返回对象assignAircraft

    def assignAircraft(row_id):
        if aircraft_queryset.filter(aircraft_type = row_id).exists():
            pass
        else:
            a = Aircraft(
                aircraft_type = row_id,
            )
            a.save()
        return Aircraft(aircraft_type = row_id)
    

    这个函数不返回保存的实例,而是一个临时实例Aircraft(aircraft_type = row_id)

    您应该返回保存的实例a,或者如果没有现有项目,则必须返回一些东西。

    def assignAircraft(row_id):
        if aircraft_queryset.filter(aircraft_type=row_id).exists():
            # DO SOMETHING AND RETURN SOMETHING
        else:
            a = Aircraft(aircraft_type=row_id)
            a.save()
            return a
    

    IMO,get_or_create manager function 可能对您有所帮助。

    【讨论】:

    • 呃,这样一个痛苦的错误!我盯着太久了!我将研究 get_or_create。谢谢!
    • 我刚刚有机会这样做,它看起来很简单,但我得到了这个错误: Traceback (most recent call last): File "csvimport.py", line 56, in aircraft = assignAircraft(row[1]), File "csvimport.py", line 31, in assignAircraft return a UnboundLocalError: local variable 'a' referenced before assignment
    • 你能显示编辑后的代码吗?该错误意味着没有必要的已保存实例。你的代码做了什么并在DO SOMETHING 部分返回?
    • 第 59 行 aircraft = Aircraft(aircraft_type = assignAircraft(row[1])), 的这段代码的目标是什么?我的意思是,如果有飞机,assignAircraft 会产生None,否则会创建新的飞机实例。然后你想用aircraft_type创建另一个飞机实例是以前的保存实例(甚至None)?字段 aircraft_typeforeignKey 本身吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多