2016-04-01 9 views
0

Ich habe eine Django Rest API, um einen Wert zurückzugeben.
Diese API kann zur gleichen Zeit getroffen werden/
Ist django Rest api thread sicher?
Ist das Django Rest Framework Thread sicher?

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

Im views.py

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) 

Ich bin besorgt darüber, zwei separate Anrufe die ‚ApiDetail‘ Ansicht und zurück, bevor die gleiche Anzahl treffen kann.

Ich arbeite an einem Mac mit Python/Django. Django 1.9.4, Django Rest 3.3.3.

Antwort

0

Ich glaube, das Problem hier wird mehr Ihr Code sein, als Django-Rest-Framework. Was Sie verwenden möchten, ist ein F() Ausdruck, wie hier dokumentiert: https://docs.djangoproject.com/en/1.9/ref/models/expressions/#f-expressions

Insbesondere möchten Sie den Abschnitt "Vermeidung von Rennbedingungen mit F()" lesen.

Sie werden mit etwas entlang der Linien von Ende:

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) 

Was die maxNumberofDigits, ich für den Leser das als eine Übung verlassen. Aber ich würde persönlich empfehlen, eine absolute Zahl maximal zu machen, anstatt eine maximale Anzahl an Ziffern. Sie könnten dann leicht das oben genannte mit Case()/When() und einem F() erreichen. (Zum Beispiel, max 6 Ziffern, die maximale Anzahl wäre 999999).

+0

F() ist sehr interessant, wickeln, aber es immer noch nicht mein Problem zu beheben. Ich muss das Element in der Datenbank in die Ansicht lesen, in der ich die Logik ausführe. Nur dann kann ich es speichern. Ich kann nicht nur die Daten in der Datenbank ändern. –

0

Sie könnten alles in einen 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)