0

У меня есть достойный опыт в представлении на основе функций в Django, и теперь я пытаюсь использовать Class based View. хотя я могу решить проблемы, но я не уверен в стандарте, я хочу, если я буду делать это правильно или неправильно, что вы, парни (разработчики Django), следуете.RESTful api в Django, используя inbult view в Django, не создавая 2 URL-адреса

Более подробно о проблеме является здесь-

views.py

from django.views.generic import View 

class InvoiceTransaction(View): 

    def __init__(self): 
     super(InvoiceTransaction, self).__init__() 

    @method_decorator(csrf_exempt) 
    def dispatch(self, *args, **kwargs): 
     return super(InvoiceTransaction, self).dispatch(*args, **kwargs) 

    def get(self, request, *args, **kwargs): 
     invoiceid = kwargs.get('invoiceid') 
     # here I have invoiceid, which is I'm passing through url paramaeters(see urls.py file) 
     # based on invoice, I can decide what type of GET requests it is 
     # whether user is asking for a single resource or all resource, right? 
     if invoiceid: 
      invoice = [Invoice.objects.get(id=invoiceid)] 
     else: 
      invoice = Invoice.objects.all() 

    def post(self, request, *args, **kwargs): 
     # some stuff 

urls.py

from django.conf.urls import patterns, url 
from invoice import views 

urlpatterns = patterns('', 
    (r'^invoices/$', views.InvoiceTransaction.as_view()), 
    (r'^invoices/(?P<invoiceid>.*)/$', views.InvoiceTransaction.as_view()), 
) 

Я после этого учебника https://realpython.com/blog/python/django-rest-framework-class-based-views/

Итак, моя проблема в том, что я создаю две строки (urls) в файле urls.py для одного запроса, чтобы определить тип запроса GET. есть ли другой или лучший способ сделать это. как я могу создать спокойный api, используя представление, и не создавая 2 URL-адреса.

PS: не стесняйтесь предлагать улучшения/изменения в вышеприведенном коде, поскольку я новичок в этой вещи. это может быть, если я использую метод отправки неправильно или idont действительно нужно init метод, все, что вы предлагаете.

ответ

0

Попробуйте эту модель, это должно работать для обоих URLs -

urlpatterns = patterns('', 
    (r'^invoices(/(?P<invoiceid>\d+)){,1}/$', views.InvoiceTransaction.as_view()), 
) 

Это делает блок всего идентификатора необязательно, но только один может быть там в большинстве.

BTW, .* не совсем подходит для ид, лучше использовать \d+

Вы можете проверить на pythex.org.

enter image description here

EDIT: с ^invoice(/(?P<invoice_type>.*)){,1}/$

enter image description here

+0

Nice :) но было бы здорово, если бы вы могли объяснить это регулярное выражение, так как мне не очень удобно с регулярным выражением, как работают двойные скобки и фигурные скобки? – bakar

+0

Внешние скобки заключают в том, что полный блок необязателен или максимальный 1 (обратите внимание на '{, 1}', следуя за ним), это позволяет 'invoice /', и если блок присутствует, то 'invoice/10 /', так как max 1 дополнительного блока поддерживается 'invoice/10/5 /' является недопустимым. –

+0

, но '^ счет-фактура (/ (? P . *)) {, 1}/$' не работает? можете ли вы предложить, что с этим не так? 'invoice_type' - это строка (на мой взгляд, будет сопоставлена ​​предопределенные слова) – bakar

0

Вам просто нужно удалить первый шаблон и удалить косую черту второго образца.
Итак, ваши urlpatterns стать

urlpatterns = patterns('', 
    (r'^invoices/(?P<invoiceid>.*)$', views.InvoiceTransaction.as_view()), 
) 

Это потому, что вы уже используете .* в регулярном выражении вместо .+, InvoiceID, что вы получаете может быть пустым.
Но обязательная косая черта в вашем регулярном выражении предотвращает это. Проще говоря, у вас уже было решение вашей проблемы.

0

Как REST утверждает, что система должна говорить только с точки зрения существительных и глаголов.

глаголы, которые применимы в RESTful архитектуры:

GET 
POST 
PUT 
PATCH 
DELETE 

И 2 URLs, что любое представление ресурсов для RESTful системы являются:

invoice/$ 
invoice/(?P<pk>\d+)/$ 

Давайте посмотрим на Просмотр, который обрабатывает URL-адреса без вызова pk.Let этого вида InvoiceListCreateView. Теперь InvoiceListCreateView должен обслуживать только запросы GET и POST. Он не должен разрешать запросы PUT, PATCH and DELETE. Зачем?

Вы можете редактировать/удалять только существующие объекты, и все существующие объекты в вашем db должны иметь идентификатор, связанный с ними. Итак, когда я GETListCreateView, я получаю список всех счетов-фактур, существующих в базе данных. Когда я POST до ListCreateView, я должен иметь возможность вставить новую запись в таблицу базы данных Invoice.

Теперь URL с прикрепленным к нему идентификатором. Назовем это RetrieveUpdateDeleteView. Как следует из названия, представление должно иметь возможность выполнять 3 функции, а именно: RETRIEVE, UPDATE и DELETE. И все эти операции могут выполняться на уже существующих объектах, для которых идентификатор будет присутствовать в URL-адресах.

Когда я GETRetrieveUpdateDeleteView, я должен получить объект для этого id, указанный в url kwargs. Аналогичным образом, PUT и PATCH должны обновлять объект данными, отправленными пользователем. И DELETE должен удалить объект из базы данных.

Вот как я планирую архитектуру REST.