2016-03-07 2 views
2

Я создал небольшое приложение-приложение &, определяющее некоторую конечную точку, как и все задачи, Due Task, Completed Task.django rest API route, показывающий ту же самую ссылку api для всей конечной точки

Вот мой url.py

#Define API Routes 
router = routers.DefaultRouter() 
#router = routers.SimpleRouter() 
router.register(r'task', views.TaskViewSet) 
router.register(r'due_task', views.DueTaskViewSet) 
router.register(r'completed_task', views.CompletedTaskViewSet) 

urlpatterns = [ 
    # Examples: 
    # url(r'^$', 'TaskAPI.views.home', name='home'), 
    # url(r'^blog/', include('blog.urls')), 
    url(r'^',include(router.urls)), 
    url(r'^admin/', include(admin.site.urls)), 
] 

Serializers.py

class TaskSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Task 
     fields = ('id','task_name','task_desc','completed','date_created') 

View.py

class TaskViewSet(viewsets.ModelViewSet): 

    queryset = Task.objects.all().order_by('-date_created') 
    serializer_class = TaskSerializer 

class DueTaskViewSet(viewsets.ModelViewSet): 
    queryset = Task.objects.all().order_by('-date_created').filter(completed=False) 
    serializer_class = TaskSerializer 

class CompletedTaskViewSet(viewsets.ModelViewSet): 
    queryset = Task.objects.all().order_by('-date_created').filter(completed=True) 
    serializer_class = TaskSerializer 

model.py

class Task(models.Model): 
    task_name = models.CharField(max_length=20) 
    task_desc = models.TextField(max_length=200) 
    completed = models.BooleanField(default=False) 
    date_created = models.DateTimeField(auto_now=True) 

при запуске сервера & hit 127.0.0.1:8080 Окно маршрута API откроется со всей конечной точкой, указывающей на ту же ссылку.

enter image description here

пожалуйста, предложить то, что происходит здесь не так. Спасибо

+0

Было бы полезно просмотреть код сериализатора. Я собираюсь предположить, что ваши 'task',' due_task' и 'finished_task' являются отношениями. Если это так, то DRF использует «HyperlinkedRelatedField» по умолчанию. – themanatuf

+0

@ themanatuf: я обновил свой код. пожалуйста, изучите его. спасибо –

+0

Хммм ... Я не уверен на 100%, как DRF работает за кулисами, но я предполагаю, что вы определили три вида с одним и тем же сериализатором, DRF использует последний. Возможно, попробуйте фильтровать один вид, а не три: http://www.django-rest-framework.org/api-guide/filtering/ – themanatuf

ответ

1

Вы действительно путаете DRF. Возможно, он сможет справиться с вашим делом, но он не может.

Я разрушится все три viewsets в один viewset с дополнительными фильтрами:

from rest_framework import filters 

class TaskViewSet(viewsets.ModelViewSet): 

    queryset = Task.objects.all() 
    serializer_class = TaskSerializer 
    filter_fields = ('completed',) 
    ordering = ('-date_created',) 

    filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter,) 

Затем, запроса условно с параметром completed:

/completed_task/ 
/completed_task/?completed=True 
/completed_task/?completed=False 
+0

- Спасибо за решение, я согласен с вами. но можно ли использовать один и тот же сериализатор для разных видов. если я хочу создать разные конечные точки без параметра запроса, то как это сделать. –

+0

Я не уверен, как это сделать.Однажды я попытался это сделать. Я установил точку останова и начал спускаться по кроличьей дыре. В любом случае, я сдался, поэтому я не уверен, как это делается. Вероятно, вы захотите войти в базу кода «router.register», чтобы выяснить, как заставить DRF делать _exactly_ то, что вы просите. Между тем: фильтры! :-) –

+1

Кажется, сводится к внедрению маршрутизатора в DRF. В настоящее время как простые, так и по умолчанию маршрутизаторы используют строчное имя модели как уникальный идентификатор зарегистрированных маршрутов 'queryset.model._meta.object_name.lower()'. Если вы действительно хотите избежать фильтров и делать это так, как вы планировали, вы можете захотеть подклассифицировать маршрутизатор по умолчанию и переопределить get_default_base_name(). Посмотрите на код реализации SimpleRouter и BaseRouter для получения более подробной информации, его довольно легко прочитать. –

6

Вы, вероятно, нужно указать дополнительный base_name аргумент в метод register(). Обычно он генерируется автоматически. Однако тот же сериализатор и относительно похожие запросы могут быть причиной того, что вы получаете одну и ту же конечную точку. Я думаю, тебе нужно что-то подобное.

router.register(r'task', views.TaskViewSet, 'task') 
router.register(r'due_task', views.DueTaskViewSet, 'due_task') 
router.register(r'completed_task', views.CompletedTaskViewSet, 'completed_task') 

Согласно docs:

Если не установлено базовое имя будет автоматически генерируется на основе атрибута queryset режима просмотра, если он есть. Обратите внимание: если в представлении нет атрибута queryset, тогда при регистрации вида необходимо установить base_name.

+0

Вместо этого следует принять ответ. –

Смежные вопросы