与此问题类似,但我没有名称空间或基本名称,因此该问题中的任何解决方案均无效。
我有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
]
所以这应该工作,因为这是漂亮的样板代码。还是我听不懂?
按照和的URL配置StudentViewSet
,您不必在中提供lookup_url_kwarg
值HyperlinkedRelatedField
。因此,您的序列化器将变为
class OrganisationSerializer(serializers.ModelSerializer):
students = serializers.HyperlinkedRelatedField(many=True,
read_only=True,
view_name='student-detail')
class Meta:
model = Organisation
fields = ('id', 'name', 'students')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句