【问题标题】:AttributeError: 'QuerySet' object has no attribute 'major_id'AttributeError:“QuerySet”对象没有属性“major_id”
【发布时间】:2019-07-10 15:51:28
【问题描述】:

我想存储与所选学校相对应的所有专业 id,以便仅显示与该专业相对应的学校。

views.py

from django.http import HttpResponse
from django.shortcuts import render
from .models import professor, School, Major, School_Major

def index(request):
    schools = School.objects.all()
    return render(request, 'locate/index.html', {'schools': schools})

#Original Attempt
#def Major(request, school_pk):
    #Filter to a show the association of 1 schools majors
    #school_choice = Major_School.objects.filter(school_id = school_pk)
    #Filter majors names required
    #majors = Major.objects.filter(id = school_choice.major_id)
    #return render(request, 'locate/major.html', {'majors' : majors})

#current Attempt
def Majors(request, school_pk):
    schools_majors_ids = []
    major_after_filter = []
    #Filter to a show the association of 1 schools majors
    school_choice = School_Major.objects.filter(school_id = school_pk)

    #Append each of the major id's to school_majors_ids list
    for store in school_choice.major_id:
        schools_majors_ids.append(school_choice.major_id)

    #Filter majors names required
    for store in schools_major_ids:
        major_after_filter = Major.objects.filter(id = schools_majors_id[store])

    return render(request, 'locate/major.html', {'major_after_filter' : major_after_filter})

Models.py

from django.db import models

class Major(models.Model):
    name = models.CharField(max_length=30, db_index=True)

class School(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    school_Major_merge = models.ManyToManyField(Major, through='School_Major')

class School_Major(models.Model):
    major = models.ForeignKey(Major, on_delete=models.CASCADE)
    school = models.ForeignKey(School, on_delete=models.CASCADE)


class professor(models.Model):
    ProfessorIDS = models.IntegerField()
    ProfessorName = models.CharField(max_length=100)
    ProfessorRating = models.DecimalField(decimal_places=2,max_digits=4)
    NumberofRatings = models.CharField(max_length=50)
    #delete major from the model  
    school = models.ForeignKey(School , on_delete=models.CASCADE)
    major = models.ForeignKey(Major , on_delete=models.CASCADE)

    def __str__(self):
        return self.ProfessorName

url.py

from django.urls import path

from . import views


urlpatterns = [
    path('', views.index, name='index'),
    path(' <int:school_pk>/', views.Majors, name='Major')
]

index.html

      <ul>
        {% for list in schools %}
        <li><a href="{% url 'Major' list.id %}">{{list.name}}</a></li>
        <br><br>
        {%endfor%}
      </ul>

建立 M2M 关系后,我的数据库中有一个单独的表,称为 school_major(我将在下面显示所有表的图像以进行可视化)

当我选择一所学校时,假设该学校的pk查询m2m字段(school_major)并基本上存储所有major_id,然后查询专业表并仅存储该学校的专业名称。

错误信息:

Internal Server Error: /locate/ 1/
Traceback (most recent call last):
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\django-2.1.2-py3.7.egg\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\django-2.1.2-py3.7.egg\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\django-2.1.2-py3.7.egg\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\David\Desktop\Actual_Project\school_finder\blog_project\locate\views.py", line 20, in Majors
    for store in school_choice.major_id:
AttributeError: 'QuerySet' object has no attribute 'major_id'
[16/Feb/2019 12:22:00] "GET /locate/%201/ HTTP/1.1" 500 68038

下面是表格的图片,注意实际上有一个major_id,并且

School DB Visual

school_major DB Visual

主要数据库视觉

【问题讨论】:

    标签: django python-3.x django-templates django-views


    【解决方案1】:

    好的,所以您的错误是因为您执行 school_choice.major_idschool_choiceQuerySet 而不是您的 School_Major 模型的实例,它确实具有 major_id 属性。

    所以你想这样做;

    for school_major in school_choice:
        schools_majors_ids.append(school_major.major_id)
    

    但是,如果您想获得major_id 的学校选择列表,您可以更有效地做到这一点;

    def majors(request, school_pk):     
        schools_majors_ids = School_Major.objects.filter(
            school_id=school_pk
        ).values_list('major_id', flat=True)
    
        major_after_filter = Major.objects.filter(id__in=schools_majors_ids)
    

    【讨论】:

    • 好吧,更高效的方法是只做Major.objects.filtet(school__id=school_pk)
    • @DanielRoseman 是的,好点。我没有过多考虑结构,只是按照现在的逻辑。
    【解决方案2】:

    所有这些屏幕截图都无关紧要。你不能迭代school_choice.major_id,这根本没有任何意义。你只需要遍历school_choice

    for store in school_choice:
        schools_majors_ids.append(store.major_id)
    

    (请注意,这段代码仍然存在多个问题,包括语法和功能。你应该更仔细地考虑你想要做什么,并阅读更多关于基本 Python 循环和 Django 查询的信息。)

    【讨论】:

    • 你追加元素的major_id,而不是查询集的,所以它是...append(store.major_id)。变量名的奇怪选择。
    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2016-11-20
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2022-12-10
    相关资源
    最近更新 更多