【问题标题】:get() returned more than one Member -- it returned 11get() 返回了多个成员——它返回了 11
【发布时间】:2021-07-08 14:47:35
【问题描述】:

我是一名学习 Django 的学生。我正在实施以便可以在我的页面上编辑成员信息。但我遇到了以下错误:我希望所有成员都能够在我的页面上编辑他们的信息。我希望能够分别获取 Model 表中的姓名、用户名和电话信息。我知道 view.py 中的 get() 部分是问题所在,但由于解决方案,它看起来很疯狂。我该如何解决这个问题?任何帮助将不胜感激。

错误详情:

MultipleObjectsReturned at /mypage/mypage_modify/
get() returned more than one Member -- it returned 11!
Request Method: POST
Request URL:    http://127.0.0.1:8000/mypage/mypage_modify/
Django Version: 3.1.5
Exception Type: MultipleObjectsReturned
Exception Value:    
get() returned more than one Member -- it returned 11!
Exception Location: D:\anaconda3\envs\vnv_zn\lib\site-packages\django\db\models\query.py, line 436, in get
Python Executable:  D:\anaconda3\envs\vnv_zn\python.exe
Python Version: 3.7.6
Python Path:    
['C:\\zeronine_project',
 'D:\\anaconda3\\envs\\vnv_zn\\python37.zip',
 'D:\\anaconda3\\envs\\vnv_zn\\DLLs',
 'D:\\anaconda3\\envs\\vnv_zn\\lib',
 'D:\\anaconda3\\envs\\vnv_zn',
 'D:\\anaconda3\\envs\\vnv_zn\\lib\\site-packages']
Server time:    Thu, 08 Jul 2021 23:33:38 +0900

View.py

from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect

from mypage.forms import *
from zeronine.models import *

# Create your views here.

def mypage_list(request):
    categories = Category.objects.all()

    return render(request, 'mypage/mypage_list.html', {'categories':categories})

def mypage_modify(request):
   current_category = None
   categories = Category.objects.all()
   member = Member.objects.get()

   if not request.user.is_authenticated:
       return HttpResponseRedirect(reverse('zeronine:login'))

   if request.method == "POST":
       member.name = request.POST['name']
       member.password = request.POST['password']
       member.username = request.user
       member.save()
       return redirect('zeronine:mypage_list')

   else:
       memberForm = MemberForm
       return render(request, 'mypage/mypage_modify.html', {'memberForm':memberForm, 'member':member, 'current_category': current_category, 'categories': categories})

Model.py

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.urls import reverse

# 회원
class Member(AbstractUser):
    username = models.CharField(primary_key=True, max_length=20, verbose_name='아이디')
    name = models.CharField(max_length=20, verbose_name='이름', default='')
    password = models.CharField(max_length=64, verbose_name='비밀번호')
    phone = models.CharField(max_length=64, verbose_name='전화번호')

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = ('Member')
        verbose_name_plural = ('Members')

# 카테고리
class Category(models.Model):
    category_code = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, allow_unicode=True)

    class Meta:
        ordering =['category_code']
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('zeronine:product_in_category', args=[self.slug])

# 상품
class Product(models.Model):
    product_code = models.AutoField(primary_key=True)
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    category_code = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, related_name='products')
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=False, allow_unicode=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    benefit = models.TextField()
    detail = models.TextField()
    target_price = models.IntegerField()
    start_date = models.DateField()
    due_date = models.DateField()

    class Meta:
        ordering = ['product_code']
        index_together = [['product_code', 'slug']]

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('zeronine:product_detail', args=[self.product_code, self.slug])


class Post(models.Model):
    post_code = models.AutoField(primary_key=True)
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    title = models.CharField(max_length=64)
    content = models.TextField()
    register_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['register_date']

# 댓글(댓글코드, 게시글코드(fk), 아이디(fk), 내용, 등록날짜)
class Comment(models.Model):
    comment_code = models.AutoField(primary_key=True)
    post_code = models.ForeignKey(Post, on_delete=models.CASCADE, db_column='post_code')
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    content = models.TextField()
    register_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.content

    class Meta:
        ordering = ['register_date']

# Zzim 모델부터 새로 추가하려는 모델들 입니다.

# 찜하기(찜코드, 아이디(fk), 상품코드(fk))
class Zzim(models.Model):
    zzim_code = models.AutoField(primary_key=True)
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')

    def __str__(self):
        return str(self.zzim_code)

# 상품이미지(이미지코드, 상품코드(fk), 이미지경로)
class Photo(models.Model):
    photo_code = models.AutoField(primary_key=True)
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')
    photo = models.ImageField(upload_to="photos/%Y%m%d")

    def __str__(self):
        return str(self.photo_code)

    class Meta:
        ordering = ['photo_code']


# 옵션(옵션코드, 옵션명, 상품코드(fk))
class Option(models.Model):
    option_code = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')

    def __str__(self):
        return self.name

# 옵션값(옵션값코드, 옵션값명, 옵션코드(fk), 상품코드(fk))
class Value(models.Model):
    value_code = models.AutoField(primary_key=True)
    option_code = models.ForeignKey(Option, on_delete=models.CASCADE, db_column='option_code')
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')
    name = models.CharField(max_length=32)

    def __str__(self):
        return self.name

# 옵션지정상품(옵션지정상품코드, 상품코드(fk), 가격, 참여수량)
class Designated(models.Model):
    designated_code = models.AutoField(primary_key=True)
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')
    price = models.IntegerField()
    rep_price = models.BooleanField(default=True)

    class Meta:
        ordering = ['designated_code']

    def __str__(self):
        return str(self.designated_code)

# 상품옵션구성(상품옵션구성코드, 옵션지정상품코드, 옵션값코드)
class Element(models.Model):
    element_code = models.AutoField(primary_key=True)
    designated_code = models.ForeignKey(Designated, on_delete=models.CASCADE, db_column='designated_code')
    value_code = models.ForeignKey(Value, on_delete=models.CASCADE, db_column='value_code')

    class Meta:
        ordering = ['element_code']

    def __str__(self):
        return str(self.element_code)

# 참여(참여코드, 아이디(fk), 상품코드(fk), 수량)
class Join(models.Model):
    join_code = models.AutoField(primary_key=True)
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')
    part_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.join_code)

    class Meta:
        ordering = ['join_code']

#참여상세(참여상세코드, 수량, 가격, 참여코드, 옵션지정상품코드)
class JoinDetail(models.Model):
    joindetail_code = models.AutoField(primary_key=True)
    join_code = models.ForeignKey(Join, on_delete=models.CASCADE, db_column='join_code')
    designated_code = models.ForeignKey(Designated, on_delete=models.CASCADE, null=True, blank=True, db_column='designated_code')
    quantity = models.IntegerField()
    price = models.IntegerField()

    def __str__(self):
        return str(self.joindetail_code)

    class Meta:
        ordering = ['joindetail_code']

mypage_list.html

{% extends 'base.html' %}
{% block title %} 마이페이지 {% endblock %}
{% block content %}

<style>
vr {
    display: block;
    width:2px;
    height: 630px;
    background-color:darkgrey;
    position:absolute;
    top:330px;
    bottom:0;
    left:750px;
    opacity: 0.2;
}
</style>

<body>

    {% load static %}
    <link rel="stylesheet" href="{% static 'main.css' %}">

    <div class="container">
        <h3 style="margin-top:50px;"><b><p style="color: #949E79; display: inline; clear:none;">{{ user.username }}</p>님의 마이페이지</b></h3>
<!--        <hr style="width: 40%; float: left"><br>-->
        <h5 style="margin-top:40px; margin-bottom: 30px; color: #848484; clear: none;">내 정보</h5>
    </div>


    <div id="username" style="margin-left: 15px; margin-top: 20px;">
         <strong style="color: #848484; margin-bottom: 10px;">이름</strong><br>
         <input style="color:#585858; margin-top: 8px; width: 350px; height: 45px; padding: 10px;" type="text" value="{{ user.name }}" name="name">
    </div>

     <div id="userid" style="margin-left: 15px; margin-top: 20px;">
         <strong style="color: #848484; margin-bottom: 10px;">아이디</strong><br>
         <input style="color:#585858; margin-top: 8px; width: 350px; height: 45px; padding: 10px;" type="text" value="{{ user.username }}" name="username">
    </div>

     <div id="userpw" style="margin-left: 15px; margin-top: 20px;">
         <strong style="color: #848484; margin-bottom: 10px;">비밀번호</strong><br>
         <input style="color:#585858; margin-top: 8px; width: 350px; height: 45px; padding: 10px;" type="text" value="{{ user.password }}" name="password">
    </div>

     <div id="userphone" style="margin-left: 15px; margin-top: 20px;">
         <strong style="color: #848484; margin-bottom: 10px;">전화번호</strong><br>
         <input style="color:#585858; margin-top: 8px; width: 350px; height: 45px; padding: 10px;" type="text" value="{{ user.phone }}" name="userphone">
     </div>

     <div id="useremail" style="margin-left: 15px; margin-top: 20px; margin-bottom: 30px;">
         <strong style="color: #848484; margin-bottom: 10px;">이메일</strong><br>
         <input style="color:#585858; margin-top: 8px; width: 350px; height: 45px; padding: 10px;" type="text" value="{{ user.email }}" name="useremail">
     </div>

    <span style="margin-left: 15px;"><a href=""><b style="color: grey">비밀번호 변경하기</b></a></span>&nbsp;&nbsp;&nbsp;
    <span><a href=""><b style="color: grey">탈퇴하기</b></a></span><br>
    <a href="{% url 'zeronine:mypage_modify' %}"><button type="submit" style="margin-top:20px; margin-left:15px; background: #637B46; border-color: #637B46; border-radius: 0px; text-align: center; width: 170px; height:55px;" class="btn btn-primary"><b>변경 사항 수정하기</b></button></a>

    <vr />

</body>
{% endblock %}

mypage_modify.html

{% extends "base.html" %}

{% block content %}

<div class="card container my-3 justify-content-center" style="border: white">
        <h3 style="margin-top:20px; margin-bottom: 30px;"><b>마이페이지 수정</b></h3>
   <form method="POST">
     {% csrf_token %}
      <div class="card-header">
         <strong>이름 : &nbsp;</strong>
         <input type="text" value="{{ user.name }}" name="name">
        </div>
      <div class="card-body">
            <div>
          <strong>아이디 : &nbsp;</strong>
         <input type="text" value="{{ user.username }}" name="username">
            </div><hr>
          <strong>비밀번호 : &nbsp;</strong>
         <input type="text" value="{{ user.password }}" name="password">
      </div>

      <div class="card-body2">
            <div>
          <strong>전화번호 : &nbsp;</strong>
         <input type="text" value="{{ user.phone }}" name="username">
            </div><hr>

      </div>
        <input class="btn btn-dark" type="submit" style="background-color: #637B46; border: white; float: right" value="수정"></form>
        <div><a href="{% url 'zeronine:mypage_list' %}"><button style="background: #848484; border: white; float: right; margin-top:-36px; margin-right: 65px;" class="btn btn-danger">이전</button></a></div>
  </form>
</div>
{% endblock %}

【问题讨论】:

  • member = Member.objects.get() 旨在检索 all 项目,但限制是这只是 single 元素,但显然在您的数据库中,有是 11 个成员,所以这没有多大意义
  • @WillemVanOnsem 那么我们该如何解决呢?使用 id 或 pk 值并没有解决问题。 first() 方法只获取第一个元素,我想使用 get 或 all() 方法获取所有元素。
  • @roboca 查看我的答案以获取一些见解

标签: django django-models django-views django-forms django-templates


【解决方案1】:

问题是你没有向你的 object.get 传递任何东西,因此它不知道要返回哪个对象。

你可以试试这样的:

member = Member.objects.get(id=request.user.id) # for the request user 

member = Member.objects.get(id=1) # for the id one 

或任何你想用来只获得一个成员的东西

【讨论】:

    猜你喜欢
    • 2022-06-21
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2021-12-09
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多