Search code examples
pythondjangourldjango-rest-frameworkmodels

Get models as variable from URL to Views django


I make Api for my database by django REST framework , i get model nickname from url.py as a variable var then use it in views.py to determine which models will use with any function i want.

So i make dictionary collection of models value, use var as a key and put result model in data variable to use model as i need .

The problem :

when i make initial value to data it not change in function call, or i don't what's happen but when i use invalid nickname it return error also i can't make data as None value , i try a lot of things like getattr but all is failed , i think it can solved by OOP python but my knowledge about it doesn't help me .

Not : i use django 2.0, database mysql, python 3.6

Edit : if i want similar method but on pk to use it in data_detail, i try this line data.objects.get(pk=pk) but it doesn't work

url.py

from .views import data_detail, data_name

urlpatterns = [
    url(r'^(?P<var>[\w-]+)/$', data_list, name='list'),
    url(r'^(?P<var>[\w-]+)/(?P<pk>\d+)/$', data_detail, name='id')
]

views.py

from .models import Authors, Users, Categories

value = {'user': Users,
         'author': Authors,
         'cate': Categories,
        }

data = value['user']

def data_list(request, var):
     global data
     data = value[var]
     return DataList.as_view()(request)

class DataList(ListAPIView):                         
     queryset = data.objects.all()
     AllDataSerializer.Meta.model = data
     serializer_class = AllDataSerializer

def data_detail(request, var, pk):
     global data
     data = value[var]
     data = data.objects.get(pk=pk)
     return DataDetail.as_view()(request)

class DataDetail(ListAPIView):                         
     queryset = data.objects.all()
     AllDataSerializer.Meta.model = data
     serializer_class = AllDataSerializer

Solution

  • from .models import Authors, Users, Categories
    
    value = {'user': Users,
             'author': Authors,
             'cate': Categories,
            }
    
    
    def data_list(request, var):
         data = value[var]
         return DataList.as_view(**{'model_name':data})(request)
    
    class DataList(ListAPIView): 
         model_name = None
    
         def get_queryset(self):
             return self.model_name.objects.all()
    
         def get_serializer_class(self):
             AllDataSerializer.Meta.model = self.model_name
             return AllDataSerializer