Django Rest Api — получение и отправка запроса за один раз — отправка запроса на основе результата получения

У меня есть это требование ниже для достижения с помощью Django Rest Framework. Мне нужно обработать запрос POST к модели 2 в запросе Get модели 3.

У меня есть две модели, Сохранил только несколько колонок

модели.py

class Customers(models.Model):  #original customers data are stored here 
    customer_id = models.BigIntegerField(db_column='customer_id', primary_key=True)  
    customer_name = models.CharField(db_column='Customer_name', blank=True, null=True, max_length=50)  

class Customers_In_Use(models.Model):  #where we will track the locking of customers  data once they get used
    customer_id = models.OneToOneField(Customers_Master, to_field='customer_id', on_delete=models.DO_NOTHING, related_name='rel_customer')  
    comments = models.TextField(blank=True,null=True)

одно представление базы данных.

Customers_View(models.Model): 
    customer_id = models.BigIntegerField()
    customer_name = models.CharField()
    in_use = models.CharField(blank=True)

    class Meta:
        managed = False

Это представление построено на бэкэнде, как показано ниже.

Select 
 C.customer_id, 
 C.customer_name, 
 CASE WHEN U.customer_id_id IS NULL THEN 'No' ELSE 'Yes' END AS In_Use,
from Customers C
left join
Customers_In_Use U
on C.customer_id=U.customer_id_id

В моем Django Rest Api я выставляю данные на основе Customers_View (запрос GET)

У меня есть POST-запрос к Customers_In_Use, который получит customer_id и комментарии в формате json.

Example Data on Customers_View:
customer_id,Customer_name,in_use
123,John,No
456,Smith,No
789,John,No
987,Tom,Yes  #Yes means this customer data is already in use 
567,Tom,No

теперь на API, если я запускаю этот запрос на получение

127.0.0.1:8000/api/customers_view/?in_use=No&customer_name=Tom

Я должен получить результат, как показано ниже

{
customer_id:567,
customer_name=Tom,
in_use:No
}

Поскольку я получил customer_id 567, мне нужно отправить почтовый запрос в Customers_In_Use.

Typical post request format with below data to be passed
{
comment:'I will use this data',
customer_id:567
}

Теперь мой вопрос, можно ли это сделать за один раз?

В момент вызова GET-запроса для customers_view мы должны отправить почтовый запрос в Customers_In_Use.

С спокойной стороны:

Я написал простой список для customer_view

class customers_views_List(generics.ListAPIView):
    queryset = customers_view.objects.all()
    serializer_class = customers_views_serializer

на customers_in_use я использовал набор представлений

class customers_In_Use_api(viewsets.ModelViewSet):
    lookup_field = 'customer_id'  
    queryset = customers_in_use.objects.all()  
    serializer_class = customers_in_use_Serializer 

person just10minutes    schedule 08.03.2018    source источник


Ответы (1)


Да, ты можешь,

Просто переопределите метод создания вашего класса customers_In_Use_api.

Вы также должны поместить комментарий, имя_клиента и in_use внутри запроса тела (например, если вы используете jquery ajax, просто поместите его в поля данных)

Вам просто нужно получить идентификатор вашего Customers_View по полям in_use и name.

После этого просто сохраните новый Customer_In_Use.

пример создания функции:

def create(self, request):
    in_use = request.data.get('in_use')
    name = request.data.get('customer_name')
    comment = request.data.get('comment')
    customers_view = get_object_or_404(Customers_View, customer_name=name)
    if customers_view.in_use != in_use:
        return Response({'error': 'Not found'}, status=status.HTTP_404_NOT_FOUND)
    serializer_datas['customer_id'] = customers_view.id
    serializer_datas['comment'] = comment
    serializer = customers_in_use_Serializer(serializer_datas)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response({'error': 'Not found'}, status=status.HTTP_404_NOT_FOUND)

Не забудьте все импорты, такие как статус и get_object_or_404, и это должно работать. Этот код не проверен, поэтому, возможно, вам придется исправить некоторые ошибки.

person greg95000    schedule 08.03.2018
comment
Большое спасибо за ваше руководство, дайте мне когда-нибудь, я просто попробую это обновление, что произойдет. - person just10minutes; 09.03.2018
comment
Я вижу, вы упомянули об этом. Вам просто нужно получить идентификатор вашего Customers_View по полям in_use и name. Но мое имя клиента может быть не уникальным. Также выполняете запрос на получение в методе создания триггера customers_views_List для customers_In_Use_api? - person just10minutes; 12.03.2018
comment
Итак, каков желаемый результат 127.0.0.1:8000/api/customers_view/?in_use=No&customer_name=John? - person greg95000; 13.03.2018
comment
это должно быть {customer_id:123, customer_name=John, in_use:No} Но когда я снова вызываю тот же URL-адрес, я должен получить {custom_id:789, customer_name=John, in_use:No}, потому что атрибут клиента 123 in_use должен был быть изменен на «Да» как часть первого вызова URL-адреса. Если я завишу от Customer_name и In_use для изменения данных в модели Customers_In_Use, тогда в моем первоначальном запросе я получу «Да» для обоих клиентов. - person just10minutes; 14.03.2018