首页 > 解决方案 > AttributeError:“QuerySet”对象没有属性“major_id”

问题描述

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

视图.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})

模型.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

网址.py

from django.urls import path

from . import views


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

索引.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_major 数据库视觉 在此处输入图像描述

主要数据库视觉 在此处输入图像描述

标签: djangopython-3.xdjango-templatesdjango-views

解决方案


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

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

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


推荐阅读