我有两个型号,目录和史诗:
class Catalog(models.Model):
created_on = models.DateTimeField(auto_now_add=True)
active = models.BooleanField(null=False, default=False)
class Epic(models.Model):
name = models.CharField(max_length=128, null=False)
slug = models.SlugField(null=False)
catalog = models.ForeignKey(Catalog, null=False, on_delete=models.CASCADE)
我已经使用DRF为Catalog创建了CRUD视图集和序列化程序.现在我想为Epic创建CRUD视图集和序列化程序,以便像/catalogs/<int:catalog_pk>/epics/<int:pk>
一样使用.我使用的是DRF嵌套路由:
router = routers.SimpleRouter()
router.register("catalog", CatalogViewSet)
catalog_router = routers.NestedSimpleRouter(router, "catalog", lookup="catalog")
catalog_router.register("epics", EpicsViewSet, basename="epics")
urlpatterns = router.urls + catalog_router.urls
以下是我对《史诗》的看法和序列化:
class EpicsViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
serializer_class = EpicSerializer
permission_classes = (IsAuthenticated, CatalogPermissions)
def get_queryset(self):
return Epic.objects.filter(catalog=self.kwargs["catalog_pk"])
class EpicSerializer(serializers.ModelSerializer):
class Meta:
model = Epic
fields = "__all__"
我try 像这样运行创建终结点:使用EPIC数据发布/catalog/1/epics/
,但我得到的错误是有效负载中缺少catalog
字段.我希望这是从URL kwargs自动完成的.我希望它从kwargs中获取catalog_id
,并将目录实例设置为序列化程序中新创建的Epic实例.
最直接的方法是覆盖序列化程序中的create
函数,但我对此犹豫不决,我想知道是否有更"僵化"的方法来做到这一点.