【问题标题】:Django Rest Framework - ImproperlyConfigured: Could not resolve URL for hyperlinked relationshipDjango Rest Framework - 配置不当:无法解析超链接关系的 URL
【发布时间】:2020-07-30 00:24:01
【问题描述】:

类似于this question,但我没有命名空间或基本名称,因此该问题中的解决方案均无效。

我有 2 个模型: 组织 学生

学生可以属于一个组织。

当我检索一个组织时,我希望返回的 JSON 中有一个子对象,它将“相关”学生列为超链接 url(根据 HATEOS)。

models.py

class Organisation(TimeStampedModel):
  objects = models.Manager()
  name = models.CharField(max_length=50)

  def __str__(self):
    return self.name

class Student(TimeStampedModel):
  objects = models.Manager()
  first_name = models.CharField(max_length=50)
  last_name = models.CharField(max_length=50)
  email = models.EmailField(unique=True)
  organisation = models.ForeignKey(to=Organisation, on_delete=models.SET_NULL, default=None, null=True, related_name='students')

serializers.py

class OrganisationSerializer(serializers.ModelSerializer):
  students = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='student-detail', lookup_url_kwarg='organisation_id')

  class Meta:
    model = Organisation
    fields = ('id', 'name','students')

class StudentSerializer(serializers.ModelSerializer):
  class Meta:
    model = Student
    fields = '__all__'

urls.py

from rest_framework import routers
from .views import OrganisationViewSet, StudentViewSet

from django.conf.urls import url

router = routers.DefaultRouter()
router.register(r'api/v1/organisations', OrganisationViewSet)
router.register(r'api/v1/students', StudentViewSet)

urlpatterns = router.urls

views.py

from .models import Organisation, Student
from rest_framework import viewsets, permissions
from .serializers import OrganisationSerializer, StudentSerializer

# Organisation Viewset
class OrganisationViewSet(viewsets.ModelViewSet):
  queryset = Organisation.objects.all()
  serializer_class = OrganisationSerializer
  permission_classes = [
    permissions.AllowAny
  ]

# Student Viewset
class StudentViewSet(viewsets.ModelViewSet):
  queryset = Student.objects.all()
  serializer_class = StudentSerializer
  permission_classes = [
    permissions.AllowAny
  ]

所以这应该可以工作,因为这是非常样板的代码。或者我有什么不明白的地方?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    根据 URL 配置和 StudentViewSet ,您不必在 HyperlinkedRelatedField 中提供 lookup_url_kwarg 值>。所以,你的序列化器会变成,

    class OrganisationSerializer(serializers.ModelSerializer):
        students = serializers.HyperlinkedRelatedField(many=True,
                                                       read_only=True,
                                                       view_name='student-detail')
    
        class Meta:
            model = Organisation
            fields = ('id', 'name', 'students')

    【讨论】:

      猜你喜欢
      • 2018-08-27
      • 2019-08-20
      • 1970-01-01
      • 2018-06-29
      • 2015-01-15
      • 2017-06-27
      • 2014-05-19
      • 1970-01-01
      相关资源
      最近更新 更多