django - Django 错误:必须使用切片将精确查找的 QuerySet 值限制为一个结果
问题描述
我正在尝试为我的机构中基于 Web 的课程规划应用程序的数据库记录。我担心的是由于views.py中的关系M2M而无法在中间表中进行记录,但它可以在shell中工作
/config/departement 处的 ValueError
精确查找的 QuerySet 值必须限制为使用切片的一个结果。
请求方法:POST 请求 URL: http: //127.0.0.1 :8000/config/departement Django 版本:2.1.7 异常类型:ValueError 异常值:
精确查找的 QuerySet 值必须限制为使用切片的一个结果。
异常位置:C:\Program Files\Python37\lib\site-packages\django\db\models\lookups.py 在 process_rhs,第 257 行 Python 可执行文件:C:\Program Files\Python37\python.exe Python 版本:3.7。 0 Python 路径:
Traceback 切换到复制和粘贴视图
C:\Program Files\Python37\lib\site-packages\django\core\handlers\exception.py in inner
response = get_response(request)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\core\handlers\base.py in _get_response
response = self.process_exception_by_middleware(e, request)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\core\handlers\base.py in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
...
▶ Local vars
E:\PLACORESA\configuration\views.py in departemnent
cursus = get_object_or_404(Cursus, libelle_cursus=cursus )
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\shortcuts.py in get_object_or_404
return queryset.get(*args, **kwargs)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\query.py in get
num = len(clone)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\query.py in __len__
self._fetch_all()
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\query.py in _fetch_all
self._result_cache = list(self._iterable_class(self))
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\query.py in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\sql\compiler.py in execute_sql
sql, params = self.as_sql()
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\sql\compiler.py in as_sql
where, w_params = self.compile(self.where) if self.where is not None else ("", [])
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\sql\compiler.py in compile
sql, params = node.as_sql(self, self.connection)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\sql\where.py in as_sql
sql, params = compiler.compile(child)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\sql\compiler.py in compile
sql, params = node.as_sql(self, self.connection)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\lookups.py in as_sql
rhs_sql, rhs_params = self.process_rhs(compiler, connection)
...
▶ Local vars
C:\Program Files\Python37\lib\site-packages\django\db\models\lookups.py in process_rhs
'The QuerySet value for an exact lookup must be limited to '
...
▶ Local vars
模型.py
class Departement(models.Model):
code_departement=models.CharField("code du département", max_length=100, unique=True)
libelle_departement=models.CharField("Libellé du département", max_length=100)
faculte=models.ForeignKey("Faculte", on_delete=models.CASCADE)
cursus=models.ManyToManyField("Cursus", through="AvoirCursus")
class Cursus(models.Model):
code_cursus=models.CharField("Code du cursus", max_length=10, unique=True)
libelle_cursus=models.CharField("Libellé du cursus", max_length=100)
class AvoirCursus(models.Model):
cursus=models.ForeignKey("Cursus", on_delete=models.CASCADE)
departement=models.ForeignKey("Departement", on_delete=models.CASCADE)
视图.py
if request.method == 'POST':
f = forms.Departement_Form(request.POST)
if f.is_valid():
dept = f.save(commit=False)
code_departement = f.cleaned_data['code_departement'].upper()
dept.code_departement = code_departement
cursus = f.cleaned_data['cursus']
dept.save()
cursus = get_object_or_404(Cursus, libelle_cursus=cursus )
print(cursus)
AvoirCursus.objects.create(departement=dept, cursus=cursus)
return redirect('configuration:lister_departement')
解决方案
这是行不通的。
if request.method == 'POST':
(...)
dept=models.Departement.objects.get(code_departement=code_departement)
cursus=models.Cursus.objects.get(code_cursus=cursus)
avoircursus=models.AvoirCursus.objects.create(cursus=cursus, departemnent=dept)
我删除了models
if request.method == 'POST':
(...)
dept = Departement.objects.get(code_departement=code_departement)
cursus = Cursus.objects.get(code_cursus=cursus)
创建一个AvoirCursus
贯穿模型的实例。
AvoirCursus.objects.create((cursus=cursus, departemnent=dept)
我对其进行了测试,并且至少在我的控制台中可以正常工作。
# your models
class Faculte(models.Model):
name = models.CharField("Libellé du département", max_length=100
class Departement(models.Model):
code_departement = models.CharField("code du département", max_length=100, unique=True)
libelle_departement = models.CharField("Libellé du département", max_length=100)
faculte = models.ForeignKey("Faculte", on_delete=models.CASCADE)
cursus = models.ManyToManyField("Cursus", through="AvoirCursus")
class Cursus(models.Model):
code_cursus = models.CharField("Code du cursus", max_length=10, unique=True)
libelle_cursus = models.CharField("Libellé du cursus", max_length=100)
class AvoirCursus(models.Model):
cursus = models.ForeignKey("Cursus", on_delete=models.CASCADE)
departement = models.ForeignKey("Departement", on_delete=models.CASCADE)
这是我为检查它所做的:
f = Faculte.objects.create(name='Sorbonne')
c = Cursus.objects.create(code_cursus='404')
d = Departement.objects.create(code_departement='code', libelle_departement='libelle', faculte=f)
ac = AvoirCursus.objects.create(cursus=c, departement=d)
这完美地工作。所以你的观点一定有问题。或者,如果您进行了未反映的更改,则可能重建您的数据库。
推荐阅读
- css - 如何在 Eclipse 构建器上找到 ruby sass 文件的位置/路径?
- java - 处理 3 三角形未显示在 Javafx 8 窗口选项卡中
- javascript - 我需要创建一个节点 js 脚本,它将读取一个文本文件并输出一个图形。我该怎么做呢?
- c# - 为什么 Unity3D 中会出现 cs0433 错误?我该如何解决?
- git - 提交后,重置头部然后签出提交,git不会恢复删除的文件
- python - conda 环境在 conda env 列表中没有可见的名称 - 如何在 shell 中激活它?
- coq - 证明过程忙于 combine_split
- spring - 如何以编程方式覆盖spring环境变量
- c# - 如何检索 USB 设备的名称
- c++ - tm_wday 返回一个 0-6 范围之外的大整数