2017-04-26 122 views
-1

为了记录,我已经搜索了这个网站的类似答案,但我仍然在试图弄清楚这个问题。Django:“模型”匹配查询不存在

我正在使用Django版本1.10,并且我正在运行MySQL作为数据库引擎。我希望在将信息保存到数据库(通过我的视图)时同时更新相关模型中的OneToOneField,但会抛出错误“IndividualEmp”匹配查询不存在。

下面是型号:

class IndividualEmp(models.Model): 
name = models.CharField(max_length = 100, db_column = 'name', primary_key = True) 
department = models.CharField(db_column='department', max_length=30, blank=True, null=True) 
emp_type = models.CharField(db_column='emp_Type', max_length=15, blank=True, null=True) 

class Meta: 
    managed = False 
    db_table = 'individual_emp' 
    app_label = 'users' 

class IndividualDetails(models.Model): 
d_name = models.OneToOneField(IndividualEmp, models.DO_NOTHING, 
           db_column = 'd_name', primary_key = True) 
gender = models.CharField(max_length=1, blank=True, null=True) 
email = models.CharField(max_length=20, blank=True, null=True) 
phone = models.CharField(max_length=9, blank=True, null=True) 

class Meta: 
    managed = False 
    db_table = 'individual_details' 
    app_label = 'users' 

这里是我的views.py文件:

from users.forms import Register 
from users.models import (Attendee, IndividualDetails, IndividualEmp) 

# Create your views here. 

def signup(request): 
form = Register(request.POST) 
if request.method == 'POST': 
    if form.is_valid(): 

     obj = Attendee() 
     obj_1 = IndividualDetails() 
     obj_2 = IndividualEmp() 

     obj.attendee_ID = form.cleaned_data['attendee_ID']    
     obj_1.name = form.cleaned_data['name'] 
     obj_1.department = form.cleaned_data['department'] 
     obj_1.emp_type = form.cleaned_data['emp_type'] 
     obj_2.gender = form.cleaned_data['gender'] 
     obj_2.email = form.cleaned_data['email'] 

     obj_3 = IndividualEmp.objects.get(name = 'name') 

     request.d_name.individualdetails.individualemp = obj_3 
     request.d_name.individualdetails.save() 

     obj.save() 
     obj_1.save() 
     obj_2.save() 

     return HttpResponseRedirect('users/signup') 

else: 
    form = Register() 

return render(request, 'users/signup.html', {'form': form})) 

这里是回溯:

Environment: 


Request Method: POST 
Request URL: http://127.0.0.1:8000/users/signup/ 

Django Version: 1.10.6 
Python Version: 2.7.11 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'users'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 

Traceback: 

File "C:\Users\Stone\Anaconda2\lib\site-packages\django\core\handlers\exception.py" in inner 
    42.    response = get_response(request) 

File "C:\Users\Stone\Anaconda2\lib\site-packages\django\core\handlers\base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "C:\Users\Stone\Anaconda2\lib\site-packages\django\core\handlers\base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "C:\Program Files\virtualenvs\env1\fireball\users\views.py" in signup 
    25.    obj_3 = IndividualEmp.objects.get(name = 'name') 

File "C:\Users\Stone\Anaconda2\lib\site-packages\django\db\models\manager.py" in manager_method 
    85.     return getattr(self.get_queryset(), name)(*args, **kwargs) 

File "C:\Users\Stone\Anaconda2\lib\site-packages\django\db\models\query.py" in get 
    385.     self.model._meta.object_name 

Exception Type: DoesNotExist at /users/signup/ 
Exception Value: IndividualEmp matching query does not exist. 

同样,所有我想do有一个FieldEmp“name”的字段条目,并且该条目被传递给IndividualDetails“d_name”并将其保存到我的数据库中酶。任何帮助表示赞赏,原谅我,如果我没有发布足够的信息。

+0

不清楚你在这里做什么。您已在'obj2'中拥有一个IndividualEmp对象。你为什么要查询另一个 - 为什么你使用字符串“name”作为查询? –

+0

这完全有可能是因为我在使用Model.objects.get时的理解是错误的 - 我读了使用文字字符串的其他解决方案。我让另一个IndividualEmp obj(obj3)将信息“传递”给IndividualDetails。至少这是主意。我已经看到了语法为Model.objects.get(id = field_name)的解决方案。在这些情况下,我的模型(我认为)没有选择“id”分配给任何字段。实际上,我试图使用IndividualEmp.objects.get(id = name),但抛出一个错误,说“id”不是一个选择。 –

+0

Yoú're混淆领域与价值观。 'name =“name”'用字符串“name”查询字段'name'。当然不会有比赛。您需要使用您需要查找的名称的*值*来查询字段“name”。 (虽然我仍不明白为什么你需要一个新的IndividualEmp)。而且,是的,你的模特*还*有一个ID字段。你真的需要去做基本的Django教程。 –

回答

0
obj_3 = IndividualEmp.objects.get(name = 'name') 

当您使用“get”方法时,django期望在数据库中有一个且只有一个具有该名称的记录。如果该名称有多个或根本没有,则会抛出异常。

https://docs.djangoproject.com/en/1.11/topics/db/queries/#retrieving-a-single-object-with-get

+0

谢谢你的回复。 SQL表individual_emp中的字段名称为:“名称”,“部门”,“Emp_Type”。我应该写语法为obj_3 = IndividualEmp.objects.get(name ='Name')? –