هل من الممكن تسمية السمات ديناميكيًا في نموذج محرك التطبيق؟

StackOverflow https://stackoverflow.com/questions/4252584

سؤال

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