1

groupbyフィルターを機能させようとすると、Atributeエラーが発生します。私のgroupbyコードは次のようになります:

{% for year, year_purchases in purchases|groupby('PurchaseDate.year')|reverse %}
            <h2 class="year">{{ year }}</h2>
            {% for ... %}
            {% endfor %}
{% endfor %}

PurchasesがPurchaseEntityのリストである場合:

class PurchaseEntity:
    def __init__(self):
        self.PurchaseDate = ''
        self.Orders = []

    def load_from_query(self,result):
        self.PurchaseDate = result.PurchaseDate

次のエラーが発生します。

AttributeError
AttributeError: PurchaseEntity instance has no attribute '__getitem__'

問題はenvironment.pyにあるようです:

def getitem(self, obj, argument):
"""Get an item or attribute of an object but prefer the item."""
try:
    return obj[argument]
except (TypeError, LookupError): #<-- Here it raises the error
    if isinstance(argument, basestring): #<-- It never reaches here
        try:
            attr = str(argument)
        except Exception:
            pass
        else:
            try:
                return getattr(obj, attr)
            except AttributeError:
                pass
    return self.undefined(obj=obj, name=argument)

getitem関数はどこでも使用されているため、Jinja2または「groupby」エラーではないと思います。私はそれをグーグルで検索しましたが、関連するものは何も見つかりませんでした。ただし、私が行ったことは、「except(TypeError、LookupError):」行を変更することであり、これは次の代替手段で機能しました。

except:
except Exception:

クラスの削除が間違っているのか、何かが足りないのかはわかりません。他のクラス(SQLAlchemyでautoloadを使用して作成)を試したところ、正常に機能したためです。助言がありますか?

ところで、getitemに送信される引数は次のとおりです。

>>> (obj,argument)
(<project.logic.purchase.PurchaseEntity instance at 0x050DF148>, 'PurchaseDate')
>>> obj.PurchaseDate
datetime.datetime(2012, 9, 25, 17, 1, 44)
4

1 に答える 1

3

PurchaseEntity拡張オブジェクトを作成してみてください。

class PurchaseEntity(object):

何も拡張しない基本クラスは、アイテムを検索しようとしたときにAttributeErrorをスローしますが、アイテムがありません。オブジェクトはTypeErrorをスローします。

>>> class Foo:
...     def foo(self):
...             void    
... 
>>> class Bar(object):
...     def bar(self):
...             void
... 
>>> foo = Foo()
>>> bar = Bar()
>>> foo['foo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Foo instance has no attribute '__getitem__'
>>> bar['bar']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Bar' object has no attribute '__getitem__'
于 2012-10-05T01:43:59.267 に答える