الحل لإرجاع قائمة من وظيفة كومبوتدبروبيرتي في ندب
سؤال
أنا تحويل بلدي التطبيق لاستخدام ندب.اعتدت أن يكون لدي شيء من هذا القبيل من قبل:
@db.ComputedProperty
def someComputedProperty(self, indexed=False):
if not self.someCondition:
return []
src = self.someReferenceProperty
list = src.list1 + src.list2 + src.list3 + src.list4 \
+ [src.str1, src.str2]
return map(lambda x:'' if not x else x.lower(), list)
كما ترون ، طريقة بلدي لتوليد القائمة معقدة بعض الشيء ، وأنا أفضل أن يبقيه على هذا النحو.ولكن عندما بدأت تحويل إلى ندب ، أنا فقط استبدال @db.ComputedProperty
بواسطة @model.ComputedProperty
ولكن بعد ذلك حصلت على هذا الخطأ:
NotImplementedError: Property someComputedProperty does not support <type 'list'> types.
أستطيع أن أرى في model.py
في تحويلة.بنك التنمية الوطني أن ComputedProperty
يرث من GenericProperty
أين في _db_set_value
هناك العديد من العبارات إذا/آخر التي تتعامل مع القيمة وفقا لنوعها ، إلا أنه لا يوجد معالجة ل lists
حاليا يذهب من خلال الشرط الأول ويعطي هذا الخطأ عندما أعود قائمة فارغة.
هل هناك طريقة للتغلب على هذا وتجنب الخطأ?
المحلول 2
يمكن القيام بهذه الوظيفة بأكملها داخل وظيفة، لذلك لا تحتاج إلى أن تكون ComputedProperty
.استخدم الخصائص المحسوبة فقط عندما تريد إجراء عملية حسابية يمكنك الاستعلام عنها.A ComputedProperty
يمكن أن يكون لها indexed
تعيين العلم إلى False
ولكن بعد ذلك هذا يعني أنك لن تكون الاستعلام عن ذلك ، وبالتالي لا تحتاج حقا أن يكون ذلك كخاصية.
def someComputedProperty(self):
if not self.someCondition:
return []
src = self.someReferenceProperty
list = src.list1 + src.list2 + src.list3 + src.list4 \
+ [src.str1, src.str2]
return map(lambda x:'' if not x else x.lower(), list)
نصائح أخرى
تحتاج إلى تعيين تكرار = العلم الحقيقي للممتلكات المحسوبة الخاصة بك في ندب.لا أعتقد أنه يمكنك استخدام لطيف " @ ديسيبل.كومبيوتربروبيرتي " تدوين ، عليك أن تقول:
def _computeValue(self):
...same as before...
someComputedProperty = ComputedProperty(_computeValue, repeated=True, indexed=False)