如何在Django REST框架中实现资源的层次结构(例如/parents/<;id>;/children)
我在Django REST Framework网站的教程中找不到关于如何实现这一点的任何信息,我也没有在文档中找到它,尽管我确信它在某个地方 我希望如何在Django REST框架中实现资源的层次结构(例如/parents/<;id>;/children),django,django-rest-framework,Django,Django Rest Framework,我在Django REST Framework网站的教程中找不到关于如何实现这一点的任何信息,我也没有在文档中找到它,尽管我确信它在某个地方 我希望issues作为父资源,pages作为子资源,以便/issues/1/pages返回issue\u id为1的所有页面 使用基于类的通用视图是否有一个很好的方法来实现这一点 这是我到目前为止所拥有的 restAPI/url.py: from django.conf.urls import patterns, url from rest_framewo
issues
作为父资源,pages
作为子资源,以便/issues/1/pages
返回issue\u id
为1的所有页面
使用基于类的通用视图是否有一个很好的方法来实现这一点
这是我到目前为止所拥有的
restAPI/url.py:
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from restAPI import views
urlpatterns = patterns('',
url(r'^issues/$', views.IssueList.as_view()),
url(r'^issues/(?P<pk>[0-9]+)/$', views.IssueDetail.as_view()),
url(r'^issues/(?P<issue_id>[0-9]+)/pages/$', views.PageList.as_view()),
url(r'^pages/(?P<pk>[0-9]+)/$', views.PageDetail.as_view()),
)
urlpatterns = format_suffix_patterns(urlpatterns)
from django.db import models
class Issue(models.Model):
created = models.DateTimeField(auto_now_add=True)
revision = models.IntegerField(default = 1)
issue_date = models.DateTimeField(auto_now_add=True)
issue_image_url = models.CharField(max_length=100)
class Page(models.Model):
created = models.DateTimeField(auto_now_add=True)
page_number = models.IntegerField()
standard_page_url = models.CharField(max_length=100, default='')
large_page_url = models.CharField(max_length=100, default='')
thumbnail_url = models.CharField(max_length=100, default='')
issue = models.ForeignKey(Issue, related_name="pages")
class Meta:
ordering = ('page_number',)
from rest_framework import serializers
from restAPI.models import Page, Issue
class IssueSerializer(serializers.ModelSerializer):
class Meta:
model = Issue
fields = ('id', 'created', 'revision', 'issue_date', 'issue_image_url')
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
fields = ('id', 'created', 'page_number', 'standard_page_url', 'large_page_url', 'thumbnail_url')
from restAPI.models import Page, Issue
from restAPI.serializers import PageSerializer, IssueSerializer
from rest_framework import mixins
from rest_framework import generics
class IssueList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Issue.objects.all()
serializer_class = IssueSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class IssueDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Issue.objects.all()
serializer_class = IssueSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
class PageList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Page.objects.all()
serializer_class = PageSerializer
def get(self, request, *args, **kwargs):
print kwargs
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class PageDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Page.objects.all()
serializer_class = PageSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
from rest_framework import viewsets
from rest_framework.response import Response
from models import Order, OrderLine
from serializers import OrderSerializer, OrderLineSerializer
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.all()
serializer_class = OrderSerializer
@link()
def lines(self, request, pk=None):
queryset = OrderLine.objects.filter(order__pk=pk)
serializer = OrderLineSerializer(queryset,
context={'request':request},
many=True)
return Response(serializer.data)
class OrderLineViewSet(viewsets.ModelViewSet):
queryset = OrderLine.objects.all()
serializer_class = OrderLineSerializer
restAPI/serializers.py:
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from restAPI import views
urlpatterns = patterns('',
url(r'^issues/$', views.IssueList.as_view()),
url(r'^issues/(?P<pk>[0-9]+)/$', views.IssueDetail.as_view()),
url(r'^issues/(?P<issue_id>[0-9]+)/pages/$', views.PageList.as_view()),
url(r'^pages/(?P<pk>[0-9]+)/$', views.PageDetail.as_view()),
)
urlpatterns = format_suffix_patterns(urlpatterns)
from django.db import models
class Issue(models.Model):
created = models.DateTimeField(auto_now_add=True)
revision = models.IntegerField(default = 1)
issue_date = models.DateTimeField(auto_now_add=True)
issue_image_url = models.CharField(max_length=100)
class Page(models.Model):
created = models.DateTimeField(auto_now_add=True)
page_number = models.IntegerField()
standard_page_url = models.CharField(max_length=100, default='')
large_page_url = models.CharField(max_length=100, default='')
thumbnail_url = models.CharField(max_length=100, default='')
issue = models.ForeignKey(Issue, related_name="pages")
class Meta:
ordering = ('page_number',)
from rest_framework import serializers
from restAPI.models import Page, Issue
class IssueSerializer(serializers.ModelSerializer):
class Meta:
model = Issue
fields = ('id', 'created', 'revision', 'issue_date', 'issue_image_url')
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
fields = ('id', 'created', 'page_number', 'standard_page_url', 'large_page_url', 'thumbnail_url')
from restAPI.models import Page, Issue
from restAPI.serializers import PageSerializer, IssueSerializer
from rest_framework import mixins
from rest_framework import generics
class IssueList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Issue.objects.all()
serializer_class = IssueSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class IssueDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Issue.objects.all()
serializer_class = IssueSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
class PageList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Page.objects.all()
serializer_class = PageSerializer
def get(self, request, *args, **kwargs):
print kwargs
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class PageDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Page.objects.all()
serializer_class = PageSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
from rest_framework import viewsets
from rest_framework.response import Response
from models import Order, OrderLine
from serializers import OrderSerializer, OrderLineSerializer
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.all()
serializer_class = OrderSerializer
@link()
def lines(self, request, pk=None):
queryset = OrderLine.objects.filter(order__pk=pk)
serializer = OrderLineSerializer(queryset,
context={'request':request},
many=True)
return Response(serializer.data)
class OrderLineViewSet(viewsets.ModelViewSet):
queryset = OrderLine.objects.all()
serializer_class = OrderLineSerializer
restAPI/views.py:
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from restAPI import views
urlpatterns = patterns('',
url(r'^issues/$', views.IssueList.as_view()),
url(r'^issues/(?P<pk>[0-9]+)/$', views.IssueDetail.as_view()),
url(r'^issues/(?P<issue_id>[0-9]+)/pages/$', views.PageList.as_view()),
url(r'^pages/(?P<pk>[0-9]+)/$', views.PageDetail.as_view()),
)
urlpatterns = format_suffix_patterns(urlpatterns)
from django.db import models
class Issue(models.Model):
created = models.DateTimeField(auto_now_add=True)
revision = models.IntegerField(default = 1)
issue_date = models.DateTimeField(auto_now_add=True)
issue_image_url = models.CharField(max_length=100)
class Page(models.Model):
created = models.DateTimeField(auto_now_add=True)
page_number = models.IntegerField()
standard_page_url = models.CharField(max_length=100, default='')
large_page_url = models.CharField(max_length=100, default='')
thumbnail_url = models.CharField(max_length=100, default='')
issue = models.ForeignKey(Issue, related_name="pages")
class Meta:
ordering = ('page_number',)
from rest_framework import serializers
from restAPI.models import Page, Issue
class IssueSerializer(serializers.ModelSerializer):
class Meta:
model = Issue
fields = ('id', 'created', 'revision', 'issue_date', 'issue_image_url')
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
fields = ('id', 'created', 'page_number', 'standard_page_url', 'large_page_url', 'thumbnail_url')
from restAPI.models import Page, Issue
from restAPI.serializers import PageSerializer, IssueSerializer
from rest_framework import mixins
from rest_framework import generics
class IssueList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Issue.objects.all()
serializer_class = IssueSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class IssueDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Issue.objects.all()
serializer_class = IssueSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
class PageList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Page.objects.all()
serializer_class = PageSerializer
def get(self, request, *args, **kwargs):
print kwargs
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class PageDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Page.objects.all()
serializer_class = PageSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
from rest_framework import viewsets
from rest_framework.response import Response
from models import Order, OrderLine
from serializers import OrderSerializer, OrderLineSerializer
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.all()
serializer_class = OrderSerializer
@link()
def lines(self, request, pk=None):
queryset = OrderLine.objects.filter(order__pk=pk)
serializer = OrderLineSerializer(queryset,
context={'request':request},
many=True)
return Response(serializer.data)
class OrderLineViewSet(viewsets.ModelViewSet):
queryset = OrderLine.objects.all()
serializer_class = OrderLineSerializer
我如何实现
问题
和页面
之间的这种关系?以下是我如何使用新的Rest框架版本2.3实现这一点的:
视图。py:
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from restAPI import views
urlpatterns = patterns('',
url(r'^issues/$', views.IssueList.as_view()),
url(r'^issues/(?P<pk>[0-9]+)/$', views.IssueDetail.as_view()),
url(r'^issues/(?P<issue_id>[0-9]+)/pages/$', views.PageList.as_view()),
url(r'^pages/(?P<pk>[0-9]+)/$', views.PageDetail.as_view()),
)
urlpatterns = format_suffix_patterns(urlpatterns)
from django.db import models
class Issue(models.Model):
created = models.DateTimeField(auto_now_add=True)
revision = models.IntegerField(default = 1)
issue_date = models.DateTimeField(auto_now_add=True)
issue_image_url = models.CharField(max_length=100)
class Page(models.Model):
created = models.DateTimeField(auto_now_add=True)
page_number = models.IntegerField()
standard_page_url = models.CharField(max_length=100, default='')
large_page_url = models.CharField(max_length=100, default='')
thumbnail_url = models.CharField(max_length=100, default='')
issue = models.ForeignKey(Issue, related_name="pages")
class Meta:
ordering = ('page_number',)
from rest_framework import serializers
from restAPI.models import Page, Issue
class IssueSerializer(serializers.ModelSerializer):
class Meta:
model = Issue
fields = ('id', 'created', 'revision', 'issue_date', 'issue_image_url')
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
fields = ('id', 'created', 'page_number', 'standard_page_url', 'large_page_url', 'thumbnail_url')
from restAPI.models import Page, Issue
from restAPI.serializers import PageSerializer, IssueSerializer
from rest_framework import mixins
from rest_framework import generics
class IssueList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Issue.objects.all()
serializer_class = IssueSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class IssueDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Issue.objects.all()
serializer_class = IssueSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
class PageList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Page.objects.all()
serializer_class = PageSerializer
def get(self, request, *args, **kwargs):
print kwargs
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class PageDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Page.objects.all()
serializer_class = PageSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
from rest_framework import viewsets
from rest_framework.response import Response
from models import Order, OrderLine
from serializers import OrderSerializer, OrderLineSerializer
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.all()
serializer_class = OrderSerializer
@link()
def lines(self, request, pk=None):
queryset = OrderLine.objects.filter(order__pk=pk)
serializer = OrderLineSerializer(queryset,
context={'request':request},
many=True)
return Response(serializer.data)
class OrderLineViewSet(viewsets.ModelViewSet):
queryset = OrderLine.objects.all()
serializer_class = OrderLineSerializer
序列化程序.py
from rest_framework import serializers
from models import Order, OrderLine
class OrderSerializer(serializers.HyperlinkedModelSerializer):
lines = serializers.HyperlinkedIdentityField(view_name='order-lines')
class Meta:
model = Order
class OrderLineSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OrderLine
from views import OrderViewSet, OrderLineViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'order', OrderViewSet)
router.register(r'orderline', OrderLineViewSet)
urlpatterns = router.urls
from models import Customer, Order
from serializers import CustomerSerializer, OrderSerializer
from rest_framework import generics
class CustomerList(generics.ListCreateAPIView):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class CustomerDetail(generics.RetrieveUpdateDestroyAPIView)
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class OrdersByCustomer(generics.ListCreateAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
def get_queryset(self):
customer_pk = self.kwargs['customer_pk']
return self.queryset.filter(customer__pk=customer_pk)
def pre_save(self, obj):
obj.customer_id = self.kwargs['customer_pk']
class OrderDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
from models import Customer, Order
from rest_framework import serializers
from rest_framework.reverse import reverse
class OrderSerializer(serializers.HyperlinkedModelSerializer)
class Meta:
model = Order
class CustomerSerializer(serializers.HyperlinkedModelSerializer)
orders = serializers.SerializerMethodField('get_customer_orders')
def get_customer_orders(self, obj):
return reverse('ordersbycustomer-list',
args=[obj.pk], request=self.context['request'])
class Meta:
model = Customer
from django.conf.urls import patterns, include, url
from views import OrdersByCustomer, CustomerDetail, CustomerList
urlpatterns = patterns("",
url(r'^customers/(?P<customer_pk>.+)/orders/$', OrdersByCustomer.as_view(), name='ordersbycustomer-list'),
url(r'^customers/(?P<pk>.+)/$', CustomerDetail.as_view(), name='customer-detail'),
url(r'^customers/$', CustomerList.as_view(), name='customer-list'),
)
url.py
from rest_framework import serializers
from models import Order, OrderLine
class OrderSerializer(serializers.HyperlinkedModelSerializer):
lines = serializers.HyperlinkedIdentityField(view_name='order-lines')
class Meta:
model = Order
class OrderLineSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OrderLine
from views import OrderViewSet, OrderLineViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'order', OrderViewSet)
router.register(r'orderline', OrderLineViewSet)
urlpatterns = router.urls
from models import Customer, Order
from serializers import CustomerSerializer, OrderSerializer
from rest_framework import generics
class CustomerList(generics.ListCreateAPIView):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class CustomerDetail(generics.RetrieveUpdateDestroyAPIView)
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class OrdersByCustomer(generics.ListCreateAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
def get_queryset(self):
customer_pk = self.kwargs['customer_pk']
return self.queryset.filter(customer__pk=customer_pk)
def pre_save(self, obj):
obj.customer_id = self.kwargs['customer_pk']
class OrderDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
from models import Customer, Order
from rest_framework import serializers
from rest_framework.reverse import reverse
class OrderSerializer(serializers.HyperlinkedModelSerializer)
class Meta:
model = Order
class CustomerSerializer(serializers.HyperlinkedModelSerializer)
orders = serializers.SerializerMethodField('get_customer_orders')
def get_customer_orders(self, obj):
return reverse('ordersbycustomer-list',
args=[obj.pk], request=self.context['request'])
class Meta:
model = Customer
from django.conf.urls import patterns, include, url
from views import OrdersByCustomer, CustomerDetail, CustomerList
urlpatterns = patterns("",
url(r'^customers/(?P<customer_pk>.+)/orders/$', OrdersByCustomer.as_view(), name='ordersbycustomer-list'),
url(r'^customers/(?P<pk>.+)/$', CustomerDetail.as_view(), name='customer-detail'),
url(r'^customers/$', CustomerList.as_view(), name='customer-list'),
)
现在,“order/id/lines”将返回与该id标识的订单有关系的序列化订单行列表
当您向路由器注册视图时,用@link或@action修饰的视图集上的任何方法都将获得一个URL。以下是我完成此操作的另一种方法: 视图.py
from rest_framework import serializers
from models import Order, OrderLine
class OrderSerializer(serializers.HyperlinkedModelSerializer):
lines = serializers.HyperlinkedIdentityField(view_name='order-lines')
class Meta:
model = Order
class OrderLineSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OrderLine
from views import OrderViewSet, OrderLineViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'order', OrderViewSet)
router.register(r'orderline', OrderLineViewSet)
urlpatterns = router.urls
from models import Customer, Order
from serializers import CustomerSerializer, OrderSerializer
from rest_framework import generics
class CustomerList(generics.ListCreateAPIView):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class CustomerDetail(generics.RetrieveUpdateDestroyAPIView)
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class OrdersByCustomer(generics.ListCreateAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
def get_queryset(self):
customer_pk = self.kwargs['customer_pk']
return self.queryset.filter(customer__pk=customer_pk)
def pre_save(self, obj):
obj.customer_id = self.kwargs['customer_pk']
class OrderDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
from models import Customer, Order
from rest_framework import serializers
from rest_framework.reverse import reverse
class OrderSerializer(serializers.HyperlinkedModelSerializer)
class Meta:
model = Order
class CustomerSerializer(serializers.HyperlinkedModelSerializer)
orders = serializers.SerializerMethodField('get_customer_orders')
def get_customer_orders(self, obj):
return reverse('ordersbycustomer-list',
args=[obj.pk], request=self.context['request'])
class Meta:
model = Customer
from django.conf.urls import patterns, include, url
from views import OrdersByCustomer, CustomerDetail, CustomerList
urlpatterns = patterns("",
url(r'^customers/(?P<customer_pk>.+)/orders/$', OrdersByCustomer.as_view(), name='ordersbycustomer-list'),
url(r'^customers/(?P<pk>.+)/$', CustomerDetail.as_view(), name='customer-detail'),
url(r'^customers/$', CustomerList.as_view(), name='customer-list'),
)
序列化程序.py
from rest_framework import serializers
from models import Order, OrderLine
class OrderSerializer(serializers.HyperlinkedModelSerializer):
lines = serializers.HyperlinkedIdentityField(view_name='order-lines')
class Meta:
model = Order
class OrderLineSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OrderLine
from views import OrderViewSet, OrderLineViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'order', OrderViewSet)
router.register(r'orderline', OrderLineViewSet)
urlpatterns = router.urls
from models import Customer, Order
from serializers import CustomerSerializer, OrderSerializer
from rest_framework import generics
class CustomerList(generics.ListCreateAPIView):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class CustomerDetail(generics.RetrieveUpdateDestroyAPIView)
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class OrdersByCustomer(generics.ListCreateAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
def get_queryset(self):
customer_pk = self.kwargs['customer_pk']
return self.queryset.filter(customer__pk=customer_pk)
def pre_save(self, obj):
obj.customer_id = self.kwargs['customer_pk']
class OrderDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
from models import Customer, Order
from rest_framework import serializers
from rest_framework.reverse import reverse
class OrderSerializer(serializers.HyperlinkedModelSerializer)
class Meta:
model = Order
class CustomerSerializer(serializers.HyperlinkedModelSerializer)
orders = serializers.SerializerMethodField('get_customer_orders')
def get_customer_orders(self, obj):
return reverse('ordersbycustomer-list',
args=[obj.pk], request=self.context['request'])
class Meta:
model = Customer
from django.conf.urls import patterns, include, url
from views import OrdersByCustomer, CustomerDetail, CustomerList
urlpatterns = patterns("",
url(r'^customers/(?P<customer_pk>.+)/orders/$', OrdersByCustomer.as_view(), name='ordersbycustomer-list'),
url(r'^customers/(?P<pk>.+)/$', CustomerDetail.as_view(), name='customer-detail'),
url(r'^customers/$', CustomerList.as_view(), name='customer-list'),
)
url.py
from rest_framework import serializers
from models import Order, OrderLine
class OrderSerializer(serializers.HyperlinkedModelSerializer):
lines = serializers.HyperlinkedIdentityField(view_name='order-lines')
class Meta:
model = Order
class OrderLineSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OrderLine
from views import OrderViewSet, OrderLineViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'order', OrderViewSet)
router.register(r'orderline', OrderLineViewSet)
urlpatterns = router.urls
from models import Customer, Order
from serializers import CustomerSerializer, OrderSerializer
from rest_framework import generics
class CustomerList(generics.ListCreateAPIView):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class CustomerDetail(generics.RetrieveUpdateDestroyAPIView)
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
class OrdersByCustomer(generics.ListCreateAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
def get_queryset(self):
customer_pk = self.kwargs['customer_pk']
return self.queryset.filter(customer__pk=customer_pk)
def pre_save(self, obj):
obj.customer_id = self.kwargs['customer_pk']
class OrderDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
from models import Customer, Order
from rest_framework import serializers
from rest_framework.reverse import reverse
class OrderSerializer(serializers.HyperlinkedModelSerializer)
class Meta:
model = Order
class CustomerSerializer(serializers.HyperlinkedModelSerializer)
orders = serializers.SerializerMethodField('get_customer_orders')
def get_customer_orders(self, obj):
return reverse('ordersbycustomer-list',
args=[obj.pk], request=self.context['request'])
class Meta:
model = Customer
from django.conf.urls import patterns, include, url
from views import OrdersByCustomer, CustomerDetail, CustomerList
urlpatterns = patterns("",
url(r'^customers/(?P<customer_pk>.+)/orders/$', OrdersByCustomer.as_view(), name='ordersbycustomer-list'),
url(r'^customers/(?P<pk>.+)/$', CustomerDetail.as_view(), name='customer-detail'),
url(r'^customers/$', CustomerList.as_view(), name='customer-list'),
)
从django.conf.url导入模式,包括,url
从视图导入订单ByCustomer、CustomerDetail、CustomerList
urlpatterns=模式(“”,
url(r“^customers/(?P.+)/orders/$”,OrdersByCustomer.as_view(),name='OrdersByCustomer-list'),
url(r“^customers/(?P.+)/$”,CustomerDetail.as_view(),name='customer-detail'),
url(r“^customers/$”,CustomerList.as_view(),name='customer-list'),
)
与视图集/路由器相比,涉及的代码更多,但这使您能够更有效地控制正在发生的事情
在这里,我选择仅将订单作为客户的子项公开。因为它们是分开的,所以可以对列表和详细信息使用不同的序列化程序类
我将def get_queryset(self):issue_id=self.kwargs['issue_id']return Page.objects.filter(issue_id=issue_id)添加到页面列表中,现在可以获取问题的工作/
/页数。现在我还得想办法发帖子
我在页面列表中添加了def pre_save(self,obj):obj.issue_id=self.kwargs['issue_id'],现在POST也可以了。从不存在的问题查询页面将返回空结果,而不是404 not found。如果有人知道更好的方法,我很想听听
如果您的方法get_queryset(self)返回的是一个空列表,而不是404 NOT FOUND,我建议您使用快捷方式函数get_list_或django的_404。
该方法可以如下所示:
from django.shortcuts import get_list_or_404
def get_queryset(self):
filter = {}
filter['issue_id'] = self.kwargs['issue_id']
return get_list_or_404(self.queryset, **filter)
我知道这是一篇老文章,但也许这可以帮助其他有相同或类似问题的人。我添加了
def get\u queryset(self):issue\u id=self.kwargs['issue\u id']return Page.objects.filter(issue\u id=issue\u id)
到页面列表
,现在为问题//pages。现在我只需要弄清楚如何发布。我将def pre_save(self,obj):obj.issue_id=self.kwargs['issue_id']
添加到PageList
中,现在发布也可以了。从不存在的问题查询页面将返回空结果,而不是404 not found。如果有人知道一个更好的方法来做这件事,我很有兴趣听到它。谢谢你的干净的例子。但是,我还希望子资源的POST位于parents//children下,并且我希望子资源只能在其父母下访问,因此children/甚至不应该是有效的路径。我想,通过使用@action修饰的方法可能可以修复发布,但与基于类的视图相比,它似乎没有多大优势。不过我真的很喜欢路由器的想法。在进一步研究之后,我认为使用视图集和路由器既方便又简单,但仍然需要大量定制,才能让它们实现父子关系之类的功能。我将在另一个答案中发布另一个更明确的方法,我一直在这样做。当使用ViewSet和@link的这种分层资源技术时,您是否找到了一种方法来更改在跟随@link时可浏览API顶部显示的docstring?实际上,它似乎显示了父级(订单)而不是子级(订单行)的帮助。如果您将pre_save添加到OrdersByCustomer,类似于我在原始问题的答案中所写的,我将使其成为可接受的答案。