【问题标题】:Django Error: The QuerySet value for an exact lookup must be limited to one result using slicingDjango 错误:必须使用切片将精确查找的 QuerySet 值限制为一个结果
【发布时间】:2019-06-11 04:25:06
【问题描述】:

我正在尝试为我的数据库记录某机构中基于网络的课程规划应用程序。我担心的是由于views.py中的关系M2M而无法在中间表中进行记录,但它可以在shell中工作

/config/departement 处的值错误

精确查找的 QuerySet 值必须使用切片限制为一个结果。

请求方法:POST 请求网址: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 

models.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)

views.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')

【问题讨论】:

  • 请发布带有回溯的整个错误消息。

标签: django


【解决方案1】:

这行不通。

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)

这非常有效。所以你的观点一定有问题。或者,如果您进行了未反映的更改,则可以重建您的数据库。

【讨论】:

  • 拜托,我在该行提出了相同的异常:cursus = Cursus.objects.get (code_cursus = cursus)。我已删除模型并更改了来自的模型的调用。从 .models 导入模型 import *
  • 是的,我试过 dept.cursus.add (cursus) ;我得到一个 AttibuteError 异常:Can not use add () on ManyToManyField 它指定了一个中间模型。请改用 configuration.AvoirCursus 的 Manager。
  • 考虑到您有 2 个 created 实例 @ 987654328@ 和 Department.
  • 对不起,它不会走路
  • 我已经编辑了我的帖子。我刚刚测试了这段代码,它可以工作。那么你能更精确吗?你能在你的视图中粘贴一条新消息吗?
【解决方案2】:

我已经成功解决了我的问题。视图中使用的表单是 models.py 中的通用表单。当我打印(cursus)时,结果是一个包含所选项目的查询集。为了在中间数据库中写入,我制作了“cursus”的过程来拥有不同的对象。

views.py 是:

if f.is_valid():
            dept = f.save(commit=False)
            code_departement = f.cleaned_data['code_departement']
            dept.code_departement = code_departement
            print(code_departement)
            cursus = f.cleaned_data['cursus']
            dept.save()
            for i in cursus:
                AvoirCursus.objects.create(departement=dept, cursus=i)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2020-05-05
    • 2019-05-26
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多