我想存储与所选学校相对应的所有专业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
答案 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_choice
是QuerySet
而不是您的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)