Skip to main content
 首页 » 编程设计

python之django save() 禁止,以防止因未保存相关对象而导致数据丢失

2025年05月04日36lexus

我正在尝试使用内联表单集来创建父模型和一些子模型。以下是我的看法。该代码可以将初始 Rfq 模型保存到数据库中,但在尝试将行保存到 inlineformset 时出错。这是一对多的关系,但使用 ForeignKey 字段完成。

# views.py 
def rfq_create(request): 
    form = RfqForm(request.POST or None) 
    RfqFormSet = inlineformset_factory(Rfq, Rfqlines, form=RfqlinesForm, extra=5, can_delete=True) 
    lines_formset = RfqFormSet(request.POST or None) 
    title = "Create a new RFQ" 
    context = { 
        "title": title, 
        "form": form, 
        "lines_formset": lines_formset, 
    } 
 
    if form.is_valid() and lines_formset.is_valid(): 
        rfq = form.save(commit=False) 
        rfq.user = request.user 
        rfq.save() 
        lines_formset.save() 
        rfq_list = Rfq.objects.order_by('rfq_id')[:20] 
        title = "RFQ List" 
        context = { 
            "title": title, 
            "rfq_list": rfq_list 
        } 
        return render(request, "rfq.html", context) 
 
    return render(request, "rfq_create.html", context) 

我已经尝试查看官方 Django 文档,但它似乎并不适用……或者无论如何都不是那么简单。

这是我的回溯

Environment: 
 
 
Request Method: POST 
Request URL: http://localhost:8000/rfq/create 
 
Django Version: 1.8.7 
Python Version: 3.4.3 
Installed Applications: 
('django.contrib.admin', 
 'django.contrib.auth', 
 'django.contrib.contenttypes', 
 'django.contrib.sessions', 
 'django.contrib.sites', 
 'django.contrib.messages', 
 'django.contrib.staticfiles', 
 'django.contrib.humanize', 
 'django.forms.formsets', 
 'jquery', 
 'crispy_forms', 
 'registration', 
 'home', 
 'rfq', 
 'dashboard', 
 'pipeline') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
 'django.middleware.common.CommonMiddleware', 
 'django.middleware.csrf.CsrfViewMiddleware', 
 'django.contrib.auth.middleware.AuthenticationMiddleware', 
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
 'django.contrib.messages.middleware.MessageMiddleware', 
 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
 'django.middleware.security.SecurityMiddleware') 
 
 
Traceback: 
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response 
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/brandon/employees/rfq/views.py" in rfq_create 
  36.         lines_formset.save() 
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/forms/models.py" in save 
  636.         return self.save_existing_objects(commit) + self.save_new_objects(commit) 
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/forms/models.py" in save_new_objects 
  767.             self.new_objects.append(self.save_new(form, commit=commit)) 
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/forms/models.py" in save_new 
  900.             obj.save() 
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/db/models/base.py" in save 
  685.                         "unsaved related object '%s'." % field.name 
 
Exception Type: ValueError at /rfq/create 
Exception Value: save() prohibited to prevent data loss due to unsaved related object 'rfq'. 

请您参考如下方法:

问题的答案是这样的

lines_formset = RfqFormSet(request.POST or None, instance=form.instance) 

form.instance 是被忽略的关键。