AttributeError:“ QuerySet”对象没有属性“ major_id”

时间:2019-02-16 20:28:49

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

我想存储与所选学校相对应的所有专业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和

学校DB Visual

enter image description here

school_major DB Visual enter image description here

主要的DB Visual enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

好吧,所以您的错误是因为您进行school_choice.major_id并且school_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)