2012-04-13 3 views
3

Angesichts der folgenden API-Definition muss ich Ereignisse nach Produktalias filtern können.Wie filtere ich API-Ergebnisse nach einem verwandten Modellattribut mit Tastypie?

Da ein Ereignis zu einem Job gehört und ein Job zu einem Produkt gehört, bin ich mir nicht sicher, wie ich das festlegen soll.

api.py:

class ProductResource(ModelResource): 

    class Meta: 
     queryset = Product.objects.all() 
     resource_name = 'product' 
     allowed_methods = ['get'] 
     excludes = ['created_at','updated_at'] 
     filtering = { 
      'alias': ALL 
     } 

class EnvironmentResource(ModelResource): 

    class Meta: 
     queryset = Environment.objects.all() 
     resource_name = 'environment' 
     allowed_methods = ['get'] 
     excludes = ['created_at','updated_at'] 

class JobResource(ModelResource): 

    product = fields.ForeignKey(ProductResource, 'product') 

    class Meta: 
     queryset = Job.objects.all() 
     resource_name = 'job' 
     allowed_methods = ['get'] 
     excludes = ['created_at','updated_at'] 

class EventResource(ModelResource): 

    environment = fields.ForeignKey(EnvironmentResource, 'environment',full=True) 
    job = fields.ForeignKey(JobResource, 'job',full=True) 

    class Meta: 
     queryset = Event.objects.all() 
     resource_name = 'event' 
     allowed_methods = ['get'] 
     excludes = ['created_at','updated_at'] 
     filtering = { 
      HOW DO I FILTER BY PRODUCT ALIAS???? 
     } 

Antwort

11

mit dem folgenden Filterdaten:

# In EventResource 
filtering = { 
    'job' : ALL_WITH_RELATIONS 
} 

# In JobResource 
filtering = { 
    'product' : ALL_WITH_RELATIONS 
} 

# In ProductResource 
filtering = { 
    'alias' : ALL 
} 

sollten Sie in der Lage sein zu tun:

/api/events/job__product__alias=something 
+0

ich sehe, wie das funktionieren soll, aber ich bin einen Syntaxfehler auf dem Produktfilter in der JobResource bekommen. –

+0

Also vielleicht könnten Sie die Fehlermeldung mit uns teilen? – kgr

+0

'Syntax an/ ungültige Syntax (api.py, Zeile 34) anfordern Methode: \t Anforderungs-URL GET: \t http://127.0.0.1:8000/ Django Version: \t 1.3.1 Ausnahmetyp: \t SyntaxError Exception Wert: \t ungültige Syntax (api.py, Zeile 34) ' –

0

Ein einfacher Weg, dies zu erreichen, ist durch Advanced Filtering. Dies vermeidet viele Abfragen, die von tastypie ForeignKey-Feldern generiert werden. Denken Sie aus Sicherheitsgründen daran, Ihre Filtereingabedaten manuell zu validieren oder zu bereinigen, bevor Sie Daten zu orm_filters hinzufügen.

class EventResource(ModelResource): 

    class Meta: 
     queryset = Event.objects.all() 
     resource_name = 'event' 
     allowed_methods = ['get'] 

    def build_filters(self, filters=None): 

     if filters is None: 
      filters = {} 

     orm_filters = super(EventResource, self).build_filters(filters) 

     # Your filtering 
     if 'job__product__alias' in filters: 
      orm_filters['job__product__alias'] = filters.get(
       'job__product__alias') 

    return orm_filters 

Them sollten Sie in der Lage sein, die gefilterten Ergebnisse zu erhalten tun:

/api/events/?job__product__alias=something 
Verwandte Themen