2016-05-13 31 views
1

我心裏有一個查詢,目前它按預期工作與Django的ORM殼:DRF如何優化這個查詢,而不是循環if?

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

但我不知道如何與DRF的SerializerMethodField實現它。這是我在此期間使用什麼,直到我自己看着辦吧:

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 

這是「理想」的方法還是不行,我不知道爲什麼:

@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

所有'Place'對象都有'order = 0'的圖像? –

+0

@AndersonLima謝謝,這是解決問題的關鍵。它簡要地想到了一些物體沒有任何圖像,但我無法建立這種聯繫......經驗教訓! – dtgq

回答

2

由於鐵娘子@安德森 - 利馬指出,這是與您的數據,而不是你的代碼中的問題。您沒有order = 0的圖像,如果不是最佳,您的第一個方法可以正確處理這種情況。

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

     # returns None here if an object with order = 0 
     # does not exist in the database. 

但是,在第二種方法中,您正在切片,但是獲取不存在的對象。因此,執行,並反過來告訴我們,你需要的只是一個嘗試,除了塊。

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

啊謝謝,我沒有自己建立這種聯繫,現在變得非常有意義。此外,我現在刪除了另一個問題,我認爲詢問關於Serpy的問題太具體了,所以我只用DRF重寫了這個問題,忘記刪除舊問題,對此抱歉。奇怪的是,Serpy需要靜態方法中的自參數,如果沒有它,它就無法工作...... DRF序列化程序不是這種情況。 – dtgq

+0

很高興整理出來。 – e4c5