【问题标题】:Django Get Returns More then one valueDjango Get 返回多个值
【发布时间】:2021-08-02 22:29:46
【问题描述】:

你好,我是 django 的新手,我正在创建一个博客站点,当我尝试访问我的博客时出现错误 我的代码: 视图.py:

from django.http import request
from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from .models import Item, Blog

# Create your views here.
class BlogView(ListView):
    model = Blog
    template_name = "main/blog.html"
    context_object_name = "blog"

    def get_context_data(self, **kwargs):
        context =  super().get_context_data(**kwargs)
        search_input = self.request.GET.get('search') or ''
        if search_input:
            context['blog'] = context['blog'].filter(title__icontains=search_input)
        return context


class Detail(DetailView):
    model = Item
    template_name = "main/item.html"
    context_object_name = "items"

    def get_context_data(self, **kwargs):
        context =  super().get_context_data(**kwargs)
        obj = Item.objects.get()
        context['items'] = Item.objects.filter(blog_id=obj.blog_id)
        return context

models.py:

from django.db import models

# Create your models here.
class Blog(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(null=True, blank=True)
    created = models.DateField(auto_now_add=True, null=True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['created']
    
    @property
    def imageURL(self):
        try:
            url = self.image.url
        except:
            url = ""
        return url
        
class Item(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(max_length=1000)
    image = models.ImageField(null=True, blank=True)
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)

    def __str__(self):
        return self.title
    
    @property
    def imageURL(self):
        try:
            url = self.image.url
        except:
            url = ""
        return url

任何关于此错误的帮助将不胜感激:

MultipleObjectsReturned at /detail/2/
get() returned more than one Item -- it returned 2!
Request Method: GET
Request URL:    http://127.0.0.1:5000/detail/2/
Django Version: 3.2
Exception Type: MultipleObjectsReturned
Exception Value:    
get() returned more than one Item -- it returned 2!
Exception Location: /home/moeez/.local/lib/python3.8/site-packages/django/db/models/query.py, line 439, in get
Python Executable:  /usr/bin/python3
Python Version: 3.8.5
Python Path:    
['/home/moeez/Python Projects/blogsite',
 '/usr/lib/python38.zip',
 '/usr/lib/python3.8',
 '/usr/lib/python3.8/lib-dynload',
 '/home/moeez/.local/lib/python3.8/site-packages',
 '/usr/local/lib/python3.8/dist-packages',
 '/usr/local/lib/python3.8/dist-packages/buildozer-1.2.0.dev0-py3.8.egg',
 '/usr/local/lib/python3.8/dist-packages/virtualenv-20.4.3-py3.8.egg',
 '/usr/local/lib/python3.8/dist-packages/sh-1.14.1-py3.8.egg',
 '/usr/local/lib/python3.8/dist-packages/filelock-3.0.12-py3.8.egg',
 '/usr/local/lib/python3.8/dist-packages/distlib-0.3.1-py3.8.egg',
 '/usr/local/lib/python3.8/dist-packages/appdirs-1.4.4-py3.8.egg',
 '/usr/lib/python3/dist-packages']
Server time:    Wed, 12 May 2021 14:31:09 +0000

【问题讨论】:

    标签: python html python-3.x django


    【解决方案1】:

    问题是你使用Item.objects.get() 没有参数。您应该像使用filter 一样使用get,但get 可能只返回一个对象,而filter 可能返回一个查询集。

    例如:

    obj = Item.objects.get(id=some_id)
    

    【讨论】:

    • 我如何获得 id
    • 当您在 url 中传递 2 的 id 时,您可能想要那个,对吧?在终端上打印你的 **kwargs 并查看一下,它应该在某个地方。
    【解决方案2】:

    在使用 get 方法时,您应该使用保证唯一性的查找,例如唯一约束中的主键或字段,如果 get() 方法返回多个对象,它会引发一个模型。MultipleObjectsReturned 与您的情况一样的异常 Item.objects.get() 发现超过 1 个对象并引发异常。

    要处理这个问题,将从 url 捕获的 pk 传递给 get 方法。您可以从 kwargs 字典中使用名为“pk”的键访问相同的方法。

    更改代码行:

    obj = Item.objects.get() 
    

    收件人:

    obj = Item.objects.get(id=self.kwargs.get('pk'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2019-06-02
      相关资源
      最近更新 更多