AttributeError: у объекта 'QuerySet' нет атрибута 'major_id' - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу сохранить все основные идентификаторы, которые соответствуют выбранной школе, чтобы отображать только школы, соответствующие этому основному.

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 (я покажу изображение ниже всех таблиц для визуализации)

Когда я выбираю школу, предполагается, что ПК этой школы запрашивает 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

enter image description here

school_major DB Visual enter image description here

Major DB Visual enter image description here

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Хорошо, значит, ваша ошибка в том, что вы делаете 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)
0 голосов
/ 16 февраля 2019

Все эти скриншоты не имеют значения.Вы не можете перебрать school_choice.major_id, это не имеет никакого смысла.Вам просто нужно перебрать school_choice.

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

(Обратите внимание, что с этим кодом по-прежнему существует множество проблем, как синтаксических, так и функциональных. Вам следует более тщательно подумать о том, что вы хотите сделать, и прочитатьподробнее об основных циклах Python и запросах Django.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...