2017-07-22 2 views
0

Ich möchte meine Django Rest Framework serialisierten Daten nach der URL filtern, die vom Benutzer zur Verfügung gestellt wird. Hier ist mein Code:Django Rest Framework Daten durch URL filtern

models.py:

class Airline(models.Model): 
    name = models.CharField(max_length=10, blank=True, null=True) 
    code = models.CharField(max_length=2, blank=True, null=True) 

    def __str__(self): 
     return self.name 

class FinancialData(models.Model): 
    airline = models.ForeignKey(Airline) 
    mainline_revenue = models.DecimalField(max_digits=7, decimal_places=2) 
    regional_revenue = models.DecimalField(max_digits=7, decimal_places=2) 
    other_revenue = models.DecimalField(max_digits=7, decimal_places=2) 
    total_revenue = models.DecimalField(max_digits=7, decimal_places=2) 

     def __str__(self): 
     return str(self.mainline_revenue) 

view.py:

class ListAirlineFinancialData(generics.ListAPIView): 
    serializer_class = FinancialDataSerializer 

    def get_queryset(self, *args, **kwargs): 
     query_list = FinancialData.objects.filter(pk=airline_id) 

urls.py:

urlpatterns = [ 
    url(r'^api/v1/airline/(?P<pk>\d+)/$', views.ListAirlineFinancialData.as_view(), name='airline_financial_data'), 
] 

Was soll ich in Ansichten Code zu filtern Meine Daten für die folgende URL. http://localhost:8000/api/v1/airline/3/

In diesem Moment Django mir einen Fehler geben, dass Name ‚airline_id‘ nicht definiert ist, kann ich verstehen, dass es will, dass ich auf airline_id passieren, die in der Datenbank ist, aber ich weiß wirklich nicht, wie es zu tun . Welchen Code soll ich in views.py schreiben, dass er alle Daten der Fluggesellschaft nach einer bestimmten ID filtert? Danke

+0

Sie müssen eine RetrieveAPIView zusammen mit LIstAPIView hinzufügen. Vielleicht hilft Ihnen das http://www.django-rest-framework.org/api-guide/generic-views/#retrieveapiview – Devansh

Antwort

0

Ich war in der Lage, die Lösung nach vielen Stunden der Forschung herauszufinden. Wenn jemand anderes hier kommen für Antwort dann änderte ich meine Ansichten zu folgenden:

class ListFinancialData(generics.ListAPIView): 
    queryset = FinancialData.objects.all() 
    serializer_class = FinancialDataSerializer 

    def get_queryset(self, *args, **kwargs): 
     return self.queryset.filter(airline_id=self.kwargs.get('airline_pk')) 
1

Ihr Lösungsansatz richtig ist. Ihr Code scheint jedoch für die Leser mehrdeutig.

Zum Beispiel: Wenn Sie eine Abfrage auf FinancialData anwenden, dann sollte Ihr URL-Muster finanzielle Daten in URLPath und nicht in Fluggesellschaft haben. Außerdem wird <pk> im Allgemeinen als Primärschlüssel für das Modell verwendet, auf das Sie die Abfrage anwenden, und nicht für den Fremdschlüssel im Modell.

urlpattern sollte So wie sein

urlpatterns = [ 
    url(
     r'^api/v1/financialdata/(?P<airline_pk>\d+)/$', 
     views.ListAirlineFinancialData.as_view(), 
     name='airline_financial_data'), 
] 

und URL werden wie: /api/v1/financialdata/1/

Auch ist es allgemeine Praxis ist, Filterparameter wie query_params passieren. In diesem Fall wird Ihre URLPATTERN

url(
     r'^api/v1/financialdata/$', 
     views.ListAirlineFinancialData.as_view(), 
     name='airline_financial_data'), 
] 

sein und Ihre URL wird wie: /api/v1/financialdata/?airline_pk=1

Bei Filterparameter wie query_params vorbei, Ihre get_queryset ein wenig anders sein wird:

def get_queryset(self, *args, **kwargs): 
    return self.queryset.filter(airline_id=self.request.GET.get('airline_pk')) 

Schließlich ist Django Rest Framework sehr leistungsfähig, aber einfach in der Verwendung. Sie können mehr über Filter auf Django Rest Framework Filtering lesen

+0

Vielen Dank Raj – Hannan

Verwandte Themen