【问题标题】:Saving an unknown object type into database in Django在 Django 中将未知对象类型保存到数据库中
【发布时间】:2019-04-26 13:12:32
【问题描述】:

我有以下型号:

class Parameter(models.Model):
    par_type = = models.CharField(max_length=30)
    value = models.TextField()

value 字段大部分时间将存储一个数字 (value=3.2118)。但有时我想分配其他对象 ID 的列表(如value="[32, 22, 45]")或字符串对象(如value="pass")等。我将根据@ 的值在下面的函数中使用value 字段987654328@:

def foo(par): # par is a Parameter object.
    return float(par.value) / 2

def bar(par):
    # Some code to convert a par to a list of objects
    object_list = get_objects(par) 
    # Return a random object from list
    return random.choice(object_list)

我不想为每种可能的对象类型编写一段代码。理想情况下,可以在任何地方使用一个 decompose() 函数。我想将对象保存为pickleJSON 类型(从here 看到它)。但我不知道该怎么做。我正在使用 MySQL 数据库。

【问题讨论】:

    标签: mysql json django pickle


    【解决方案1】:

    你可以这样尝试使用BinaryField:

    import pickle
    
    class Parameter(models.Model):
        _value = models.BinaryField()
    
        def set_data(self, data):
            self._value = pickle.dumps(data)
    
        def get_data(self):
            return pickle.loads(self._value)
    
        value = property(get_data, set_data)
    

    用法:

    In: b = Foo.objects.create(value=1)
    
    In: b.value
    Out: 1
    
    In: b = Foo.objects.create(value={1:1,2:2})
    
    In: b.value
    Out: {1: 1, 2: 2}
    
    In: b = Foo.objects.create(value=[1,1])
    
    In: b.value
    Out: [1, 1]
    

    仅供参考,您不能存储 pass,因为它不是 Python 对象,而是它的语法的一部分。考虑使用None,而不是通过。

    【讨论】:

    • 效果很好!为了清楚你的最后一行,我打算设置一个字符串值,比如Foo.objects.create(value="pass"),它工作得很好。我相信你的意思是我不能这样做Foo.objects.create(value=pass)
    猜你喜欢
    • 1970-01-01
    • 2018-05-30
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多