هل من الممكن تسمية السمات ديناميكيًا في نموذج محرك التطبيق؟
-
27-09-2019 - |
سؤال
setattr
يسمح لك بتسمية سمات ديناميكي في فصول Python. أحاول أن أفعل شيئًا مشابهًا مع نموذج محرك التطبيق:
class MyModel(db.Model):
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
# Doesn't fully work
setatr(self, 'prop1', db.ListProperty(db.Key))
setatr(self, 'prop2', db.StringListProperty())
# Works fully
# prop1 = db.ListProperty(db.Key))
# prop2 = db.StringListProperty())
يجمع هذا الرمز ، لكن عندما أتصل model.prop1.append(key)
في وقت لاحق ، أحصل على هذا الخطأ:
AttributeError: 'ListProperty' object has no attribute 'append'
أظن أن هذا بسبب prop1
تم إعلانه في النماذج بدلاً من self.prop1
, ، لكنني لا أفهم تمامًا أهمية بناء الجملة.
هل أنجز أي شخص هذا ، أم أن أي شخص لديه أي نظرة ثاقبة على الاختلافات النحوية؟
المحلول
هذا السؤال حتى:
يعطي مثالا على ما تريد القيام به.
نصائح أخرى
أعتقد أنك تبحث عن db.Expando
الفصل (بدلاً من db.Model
).
لست متأكدا ولكن هذا العمل ربما:
class MyModel(db.Model):
@classmethod
def new(cls, *args, **kwargs):
setattr(cls, 'props1', db.ListProperty(db.Key))
setattr(cls, 'props2', db.StringListProperty())
mymodel = cls(*args, **kwargs)
delattr(cls, 'props1')
delattr(cls, 'props2')
return mymodel
لا تنتمي إلى StackOverflow