【问题标题】:Django: "Model" matching query does not existDjango:“模型”匹配查询不存在
【发布时间】:2017-04-26 14:38:44
【问题描述】:

为了记录,我已经在这个网站上搜索了类似的答案,但我仍在努力解决这个问题。

我正在使用 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.

再一次,我想做的只是在 IndividualEmp “name” 中输入一个字段,并将这个相同的条目传递给 IndividualDetails “d_name” 并将其保存到我的数据库中。感谢您提供任何帮助,如果我没有发布足够的信息,请原谅我。

【问题讨论】:

  • 不清楚你在这里做什么。您已经有一个 IndividualEmp 对象,位于obj2。你为什么要查询另一个 - 为什么要使用文字字符串“name”作为查询?
  • 我对使用 Model.objects.get 的理解完全有可能是不正确的——我阅读了其他使用文字字符串的解决方案。我制作了另一个 IndividualEmp obj (obj3) 以将信息“传递”给 IndividualDetails。至少那是想法。我见过语法为 Model.objects.get(id = field_name) 的解决方案。在这些情况下,我的模型(我认为)没有选择“id”来分配给任何字段。事实上,我尝试使用 IndividualEmp.objects.get(id = name),但抛出了一个错误,说“id”不是一个选择。
  • 您将字段与值混淆了。 name="name" 使用文字字符串“name”查询字段 name。当然不会有对手。您需要使用您需要查找的名称的查询字段name。 (虽然我仍然不明白你为什么需要一个新的 IndividualEmp)。而且,是的,您的模型确实也有一个 id 字段。你真的需要去学习基本的 Django 教程。
  • 很抱歉造成混淆并记录在案,是的,我一直在关注 Django 教程并阅读其他文档。我遇到了其他几个错误,我按照说明解决了这些错误。在这一点上,我遇到了这个特殊的问题,我正在寻求澄清。所以,如果解决方案是从“字段”中获取“值”,给定我的views.py,我如何从IndividualEmp对象“name”中检索值并将其传递给IndividualDetails对象“d_name”?再次感谢。

标签: python mysql django


【解决方案1】:
 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

【讨论】:

  • 感谢您的回复。 SQL表individual_emp中的字段名称为:“Name”、“Department”、“Emp_Type”。我应该把语法写成 obj_3 = IndividualEmp.objects.get(name = 'Name')?
猜你喜欢
  • 2015-01-28
  • 2022-01-05
  • 2020-10-15
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多