Django - 在模型中加载大型默认值的正确方法

时间:2012-10-25 13:42:21

标签: python django django-models

我在django模型中有一个名为schema的字段,它通常包含一个相当大的json字符串。在创建任何新实例时,我想添加一个默认值(大约2000个字符)。

我发现将整个事物转储到变量models.py中是相当不洁净的。在我的架构中加载此默认值的最佳方法是什么(TextField)?

示例:

class LevelSchema(models.Model):
    user = models.ForeignKey(to=User)
    active = models.BooleanField(default=False)
    schema = models.TextField() # Need a default value for this

我想到了这一点。如果我使用json文件在某处存储默认值,那么放置它的最佳位置是什么?显然,如果它位于文件夹中的相同应用程序中,则更为可取。

2 个答案:

答案 0 :(得分:1)

我发现变量的使用不是特别不洁净。但你可以“滥用” 事实上,所有字段都支持的default参数可以是可调用的。

所以你可以这个“疯狂”的事情:

def get_default_json():
    json_text = open('mylargevalue.json').read()
    return json_text

然后在你的领域:

schema = models.TextField(default=get_default_json)

我没有尝试过类似的东西,但我认为它可以起作用。

答案 1 :(得分:1)

  

文字相当庞大。将覆盖文件的一半   格式化的json,我想将来可以编辑。我更喜欢装货   它来自一个文件(如灯具),只是我想知道是否有   已经存在于Django中的方法。

在django,你有两个选择:

  1. 收听post_save,当created为真时,通过读取文件设置对象的默认值。

  2. 将默认值设置为可调用(函数),并在该方法中读取文件(确保在之后关闭它),并返回其内容。

  3. 您还可以将数据粘贴到某个k / v商店(如redis或memcache)中,以便更快地访问。它也会更好,因为你不会经常打开和关闭文件。

    最后,限制性最强的选项是在数据库上设置一个触发器,为您填充。您必须将json存储在数据库中的某个位置。这种方法的附加好处是你可以编写一个django前端来更新json。缺点是它会将您的应用程序限制在您决定使用触发器支持的数据库中。