“如何在DRF中添加嵌套网址,动态模型视图集”

问题描述 投票:0回答:1

*我有*router.register(r'reseller/', views.UserViewSet)router.register(r'one/', views.OneLViewSet)

我想使嵌套的网址像'reseller /或{pk} / one /

但是我失败了。

我尝试将DynamicRelationField添加到用户模型,但是没有用。

我的用户模型] >>

       phone = models.CharField(_('phone number'), max_length=30, blank=True)
       address = models.CharField(_('reseller address'), max_length=220, blank=True)

OneL模型

] >>
        id = models.AutoField(_('lottery id'), unique=False, primary_key=True, auto_created=True,)

        lno = models.CharField(_('1000ks lottery'), max_length=8, unique=True)
        name = models.CharField(_('customer name'), max_length=100, )
        reseller = models.ForeignKey('lotto_app.User', on_delete=models.CASCADE)

user_serializer

] >>
    class UserSerializer(serializers.DynamicModelSerializer):
        class Meta:
            model = User
            fields = ('id', 'username', 'email', 'phone', 'address', )

oneL序列化器

 class OneLSerializer(serializers.DynamicModelSerializer):
        reseller = fields.DynamicField(source='reseller.username', read_only=True)

        class Meta:
            model = OneL
            fields = (
                'id', 'lno', 'name', 'reseller', 'phone', 'address', 'nth', 'is_winner', 'prize_details', 'created_at',
                'updated_at')

用户动态视图集

    class UserViewSet(DynamicModelViewSet):
        permission_classes = (IsAdmin, IsAuthenticated)
        model = User
        queryset = User.objects.all()
        serializer_class = UserSerializer

OneLviewSet

] >>
    class OneLViewSet(DynamicModelViewSet):
        permission_classes = (IsAuthenticated, IsOwner)
        model = OneL
        queryset = OneL.objects.all()
        serializer_class = OneLSerializer


        def create(self, request, *args, **kwargs):
            serializer = OneLSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save(reseller=request.user)
                return Response(serializer.data)

        def list(self, request, *args, **kwargs):
            queryset = OneL.objects.filter(reseller=request.user)
            serializer = OneLSerializer(queryset, many=True)
            return Response(serializer.data) 


我想更改this.url

    router.register(r'reseller', views.UserViewSet)
    router.register(r'one', views.OneLViewSet)
    urlpatterns = [
        path('api/saledatas/', include(router.urls))
    ]

对此

    router.register(r'reseller', views.UserViewSet)
    router.register(r'reseller/{pk}/one', views.OneLViewSet) #or <int:pk>
    urlpatterns = [
        path('api/saledatas/', include(router.urls))
    ]

更改后错误-找不到“请求网址:http://localhost:8000/api/saledatas/reseller/1/one/”!以及如何使http://localhost:8000/api/saledatas/reseller/1/one/生效。

*我有* router.register(r'reseller /',views.UserViewSet)和router.register(r'one /',views.OneLViewSet)我想使嵌套URL像'reseller /或{pk} /一个/但是我失败了。我尝试过...

在Userviewset中创建动作

    @action(detail=True, methods=["get"])
    def one(self, request):
         ''' to get instance just do get_object() it'll give reseller instance '''
        user = self.get_object()
        ones = user.onel_set.all()
        ''' now you can work on one '''
django-rest-framework django-urls django-rest-viewsets dynamic-rest
1个回答
0
投票

在Userviewset中创建动作

    @action(detail=True, methods=["get"])
    def one(self, request):
         ''' to get instance just do get_object() it'll give reseller instance '''
        user = self.get_object()
        ones = user.onel_set.all()
        ''' now you can work on one '''
© www.soinside.com 2019 - 2024. All rights reserved.