سؤال

أنا تحويل بلدي التطبيق لاستخدام ندب.اعتدت أن يكون لدي شيء من هذا القبيل من قبل:

@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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top