2015-09-13 3 views
2

Итак, я строю свой первый проект Django с помощью Django Rest Framework и у меня есть эти 3 модели на нем:Исключения Значение: Тип объект «Дисциплина» не имеет атрибута «описания»

class Student(models.Model): 
    user = models.OneToOneField(User, unique=True) 
    ra = models.IntegerField() 

class Discipline (models.Model): 
    description = models.CharField(max_length=150) 
    professor = models.ForeignKey(Professor, related_name='disciplines') 
    learners = models.ManyToManyField('students.Student', through='enrollments.enrollment', related_name='disciplines') 

class Enrollment (models.Model): 
    discipline = models.ForeignKey('disciplines.Discipline') 
    student = models.ForeignKey(Student) 
    enroll_date = models.DateField(auto_now_add=True) 

И для эти модели я имею эти сериализаторы:

class StudentSerializer (serializers.ModelSerializer): 
    ra = serializers.IntegerField(source=Student.ra) 
    disciplines = EnrolledDisciplinesSerializer(source="enrollment_set", many=True) 
    activities = RealizedActivitiesSerializer(source='activities_set', many=True) 

    class Meta: 
     model = User 
     fields = ('id','username', 'email', 'password', 'ra', 'disciplines','activities') 

class DisciplineSerializer (serializers.ModelSerializer): 
    professor = serializers.StringRelatedField() 
    learners = LearnersSerializer(source="enrollment_set", many=True) 

    class Meta: 
     model = Discipline 
     fields = ('id', 'description', 'professor', 'learners') 

class EnrolledDisciplinesSerializer(serializers.ModelSerializer): 
    id = serializers.ReadOnlyField(source=Discipline.pk) 
    description = serializers.ReadOnlyField(source=Discipline.description) 

    class Meta: 
     model = Enrollment 
     fields = ('id', 'description', 'enroll_date') 


class LearnersSerializer(serializers.ModelSerializer): 
    id = serializers.ReadOnlyField(source=Student.pk) 
    ra = serializers.ReadOnlyField(source=Student.ra) 

    class Meta: 
     model = Enrollment 
     fields = ('id', 'ra', 'enroll_date') 

И на моем views.py для моих студентов приложение, которое я следующий код:

class StudentList (generics.ListCreateAPIView): 
    model = Student 
    serializer_class = StudentSerializer 
    permission_classes = [ 
     permissions.IsAuthenticatedOrReadOnly, 
    ] 


class StudentDetail (generics.RetrieveAPIView): 
    model = Student 
    serializer_class = StudentSerializer 


class StudentDisciplineList (generics.ListAPIView): 
    model = Enrollment 
    serializer_class = EnrolledDisciplinesSerializer 

    def get_queryset(self): 
     queryset = super(StudentDisciplineList, self).get_queryset() 
     return queryset.filter(student__pk=self.kwargs.get('pk')) 


class StudentActivitiesList (generics.ListAPIView): 
    model = Activity 
    serializer_class = ActivitiesSerializer 

    def get_queryset(self): 
     queryset = super(StudentActivitiesList, self).get_queryset() 
     return queryset.filter(student__pk=self.kwargs.get('pk')) 

После создания взглядов я добавил следующее в мой файл urls.py в моем приложении студентов:

url_patterns = [ 
    '', 
    url(r'^/(?P<pk>\d+)/disciplines$', StudentDisciplineList.as_view(), name='studentdiscipline-list'), 
    url(r'^/(?P<pk>\d+)/activities$', StudentActivitiesList.as_view(), name='studentactivities-list'), 
    url(r'^/(?P<pk>\d+)$', StudentDetail.as_view(), name='student-detail'), 
    url(r'^$', StudentList.as_view(), name='student-list'), 
] 

Затем я добавил это мой основной urls.py файл:

import students.urls 

urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^students/', include(students.urls)), 
] 

После выполнения этого я пошел в http://127.0.0.1:8000/students и получил следующее:

File "C:\Users\Douglas\tg_project\enrollments\serializers.py" in EnrolledDisciplinesSerializer 


9.  description = serializers.ReadOnlyField(source=Discipline.description) 

Exception Type: AttributeError at /admin 
Exception Value: type object 'Discipline' has no attribute 'description' 

Я уже искал об этом как на Google и StackOverflow, но я не мог найти что-то, чтобы помочь мне. Я также просмотрел весь код, чтобы убедиться, что я не сделал никаких опечаток, но кажется, что все в порядке.

Я очень благодарен за любую помощь в решении этой проблемы.

+0

Почему 'дисциплина = модели.ForeignKey ('disciplines.Discipline')' в модели «Зачисление», а не просто 'дисциплина = модели.ForeignKey (Discipline)'? – Pynchia

+0

@Pynchia всякий раз, когда я пытаюсь это сделать, я получаю следующую ошибку для m2m в f.rel.through._meta.local_fields: AttributeError: объект 'str' не имеет атрибута '_meta' –

ответ

1

source должен быть строкой, содержащей атрибуты для получения из экземпляра Enrollment. Поэтому в вашем EnrolledDisciplinesSerializer, для description, вам нужно 'discipline.description'. discipline (нижний) - это имя атрибута для доступа к дисциплине для этой регистрации, description имя, чтобы получить описание для этого экземпляра Discipline. То же самое для других полей.

Django использует метаклассы для создания моделей. Как это работает, поля, которые вы определяете в модели, не являются атрибутами класса. Это означает, что класс Discipline не будет иметь атрибут Discipline.description. Только экземпляры Discipline имеют атрибут description.

+0

Большое спасибо, это решило проблему , –