2016-04-01 17 views
0

Bir değer döndürmek için bir Django Rest API'm var.
Bu API aynı zamanda oluşabilir/
django rest api thread safe var mı? views.pyDjango Rest Framework iş parçacığı güvenli mi?

class ApiDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Api.objects.all() 
    serializer_class = ApiSerializer 

    def get(self, request, *args, **kwargs): 
     currentForm = self.kwargs['pk'] 
     currentApi = Api.objects.get(pk = currentItem) 
     currentApi.currentNumber += 1 

     tempCurrentNum = currentApi.currentNumber 
     strCurrentNum = str(tempCurrentNum) 
     currentNumLength = len(strCurrentNum) 

     if(currentNumLength > currentApi.maxNumberOfDigitsInNum): 
      currentApi.currentNumber = 1 

     currentApi.iterativeField = currentApi.fieldPrefix + str(currentApi.currentNumber) 
     currentApi.save() 
     return self.retrieve(request, *args, **kwargs) 

endişe iki ayrı çağrılar 'ApiDetail' görünümünü vurmak ve daha önce aynı numarayı dönebilirsiniz neredeyim

$http.get('//0.0.0.0:8000/api/tempName?format=json') 
     .success(function (data) { 
       $scope.iterativeNum = data.iterativeField 
     }) 


.

Python/Django kullanarak Mac üzerinde çalışıyorum. Django 1.9.4, Django Rest 3.3.3.

cevap

0

Buradaki sorunun django-rest-framework'den çok daha fazla kodunuz olacağına inanıyorum. https://docs.djangoproject.com/en/1.9/ref/models/expressions/#f-expressions

Özellikle, "F kullanılarak kaçınmak yarış koşullarında()" bölümünü okuyun isteyeceksiniz: Burada belgelendiği gibi ne kullanmak istediğiniz, bir F() ifadesidir.

Sen çizgisinde bir şey ile sona erecek:

from django.db.models import F 
from rest_framework import generics 


class ApiDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Api.objects.all() 
    serializer_class = ApiSerializer 

    def get(self, request, *args, **kwargs): 
     currentApi = self.get_object() 
     currentApi.currentNumber = F('currentNumber') + 1 
     currentApi.iterativeField = F('fieldPrefix') + (F('currentNumber') + 1) 
     currentApi.save() 
     return super(ApiDetail, self).get(request, *args, **kwargs) 

Bildiğim kadarıyla maxNumberofDigits, ben okuyucuya alıştırma olarak bu bırakacaktır. Ancak, maksimum rakam sayısından ziyade, mutlak bir sayı maks. Daha sonra yukarıdakileri Case()/ When() ve bir F() kullanarak kolayca gerçekleştirebilirsiniz. (Örneğin, maksimum 6 basamak, maksimum sayı 999999 olur).

+0

F herşeyi sarabilirdiniz() çok ilginç ama hala benim sorunu çözmez. Veritabanındaki öğeyi mantığı çalıştırdığım görünüme okuman gerek. Ancak o zaman onu kaydedebilirim. Veritabanındaki verileri değiştiremiyorum. –

0

Bir transaction with transaction.atomic()

def get(self, request, *args, **kwargs): 
    with transaction.atomic() 
     currentApi = Api.objects.get(pk=currentItem) 
     ... 
     currentApi.save() 

    return self.retrieve(request, *args, **kwargs)