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
Alle 'Place'-Objekte haben ein Bild mit' order = 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