【问题标题】:Create a property that work similar to Django fields(The property wrongly acts as class attribute)创建一个类似于 Django 字段的属性(该属性错误地充当类属性)
【发布时间】:2018-07-05 19:56:53
【问题描述】:

我创建了一个函数来实例化一个封装一些通信的属性:

def orion_field(name, field=None):
    def getter(self,):
        return self.get(name)

    def setter(self, value):
        self.set(name, value)

    return property(getter, setter)

我想以与 Django 字段类似的方式将它包含在我的 Django 模型中:

class KPI(models.Model):
    orion_id = models.CharField(primary_key=True, unique=True, 
                                max_length=10)
    data = JSONField(blank=True, default={})
    name = orion_field("name")

    def set(self, attribute, value):
        self.data[attribute]= value
        # Ugly code removed that send stuff to server

    def get(self, attribute):
        # Ugly code removed that may(or may not) bring stuff from server
        return self.data[attribute]

通信代码运行良好,但我注意到这些新属性在类级别上运行。

    orion_entity1 = KPI()
    orion_entity2 = KPI()
    orion_entity1.name = "Babar"
    print(orion_entity2.name) 
    >>> Babar

我想在某些时候 Django 将类字段转换为实例字段。我搜索了他们的代码,但我迷路了。

【问题讨论】:

    标签: python django python-3.x django-models properties


    【解决方案1】:

    问题是您使用可变字典 {} 作为默认值。请改用dict,然后将为每个实例实例化一个单独的空字典。

    data = JSONField(blank=True, default=dict)
    

    有关更多信息,请参阅JSONField docs 中的说明。

    【讨论】:

    • 我被这个属性蒙蔽了,我没有看字典。我将更改标题以反映真正的问题。谢谢你!
    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 2015-06-16
    • 2010-11-07
    • 2017-01-16
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多