0

* i have * router.register(r'reseller/', views.UserViewSet) and router.register(r'one/', views.OneLViewSet)

I want to make nested url like 'reseller/ or {pk}/one/

But i'm failed.

I tried adding DynamicRelationField to User Model but not worked.

my user_model

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

OneL model

        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 serializer

 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')

user dynamicviewset

    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) 


I want to change this.url

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

TO THIS

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

After change error-- "Request URL: http://localhost:8000/api/saledatas/reseller/1/one/" Not Found! And How to make http://localhost:8000/api/saledatas/reseller/1/one/ to be work.

1 Answers1

0

create action in 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 '''
jeevu94
  • 477
  • 4
  • 16