2016-05-13 8 views
1

Ich habe eine Abfrage im Auge, zur Zeit arbeitet es wie in der Schale mit dem Django ORM erwartet:DRF Wie kann diese Abfrage optimiert werden, anstatt if's zu loopen?

>>> Place.objects.all()[0].images.filter(order=0)[0].filename 
'y5IUMPyv.jpg' 

Aber ich weiß nicht, wie es mit SerializerMethodField der DRF zu implementieren. Das ist, was ich in der Zwischenzeit mit bis ich es herausfinden können:

class CardSerializer(serializers.Serializer): 
    image = serializers.SerializerMethodField() 

    @staticmethod 
    def get_image(obj): 
     for d in obj.images.all(): 
      if d.order == 0: 
       return d.filename 

Dies ist die „ideale“ Methode, die nicht funktioniert, und ich weiß nicht, warum:

@staticmethod 
    def get_image(obj): 
     return obj.images.filter(order=0)[0].filename 

Traceback (most recent call last): 
    File "/home/admin/env/lib/python3.4/site-packages/django/core/handlers/base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/admin/env/lib/python3.4/site-packages/django/core/handlers/base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/admin/env/lib/python3.4/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "/home/admin/env/lib/python3.4/site-packages/django/views/generic/base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/home/admin/env/lib/python3.4/site-packages/rest_framework/views.py", line 466, in dispatch 
    response = self.handle_exception(exc) 
    File "/home/admin/env/lib/python3.4/site-packages/rest_framework/views.py", line 463, in dispatch 
    response = handler(request, *args, **kwargs) 
    File "/home/admin/env/lib/python3.4/site-packages/rest_framework/generics.py", line 201, in get 
    return self.list(request, *args, **kwargs) 
    File "/home/admin/env/lib/python3.4/site-packages/rest_framework/mixins.py", line 45, in list 
    return self.get_paginated_response(serializer.data) 
    File "/home/admin/env/lib/python3.4/site-packages/serpy/serializer.py", line 134, in data 
    self._data = self.to_value(self.instance) 
    File "/home/admin/env/lib/python3.4/site-packages/serpy/serializer.py", line 123, in to_value 
    return [serialize(o, fields) for o in instance] 
    File "/home/admin/env/lib/python3.4/site-packages/serpy/serializer.py", line 123, in <listcomp> 
    return [serialize(o, fields) for o in instance] 
    File "/home/admin/env/lib/python3.4/site-packages/serpy/serializer.py", line 107, in _serialize 
    result = getter(self, instance) 
    File "/home/admin/src/places/serializers.py", line 72, in get_image 
    return obj.images.filter(order=0)[0].filename 
    File "/home/admin/env/lib/python3.4/site-packages/django/db/models/query.py", line 297, in __getitem__ 
    return list(qs)[0] 
IndexError: list index out of range 
+1

Alle 'Place'-Objekte haben ein Bild mit' order = 0 '? –

+0

@andersonlima Danke, das war der Schlüssel zur Lösung des Problems. Es kam mir kurz in den Sinn, dass einige der Objekte keine Bilder haben, aber ich konnte diese Verbindung nicht herstellen ... Lektion gelernt! – dtgq

Antwort

2

als iron maiden @ anderson-lima hat darauf hingewiesen, dies ist ein Problem, mit Ihren Daten anstatt Ihrem Code. Sie haben kein Bild mit order = 0 und Ihre erste Methode behandelt diese Situation korrekt, wenn nicht optimal.

Allerdings nehmen Sie in Ihrem zweiten Ansatz ein Stück, aber holen ein Objekt, das nicht existiert. Daher die Ausnahme, und die wiederum sagt uns, dass das, was Sie brauchen, ein Versuch ist, außer Block.

@staticmethod 
def get_image(obj): 
    try: 
     return obj.images.filter(order=0)[0].filename 
    except IndexError: 
     return None 
+0

Ah danke, ich habe diese Verbindung nicht selbst gemacht, macht jetzt vollkommen Sinn. Außerdem habe ich diese andere Frage jetzt gelöscht, ich dachte, dass die Frage nach Serpy zu spezifisch war, also schrieb ich die Frage nur mit DRF um und vergaß, die alte zu löschen, tut mir leid. Seltsamerweise benötigt Serpy den Selbstparam in der statischen Methode, funktioniert ohne ihn nicht ... Nicht mit DRF-Serialisierern. – dtgq

+0

Froh, dass es aussortiert ist. – e4c5

Verwandte Themen