【问题标题】:Django default data (Fixtures?) in views.py on form.save()?form.save()上views.py中的Django默认数据(Fixtures?)?
【发布时间】:2016-07-22 11:37:24
【问题描述】:

想知道每次使用form.save() 创建新帐户时,在 Django 中插入一些默认数据库数据的最佳方法是什么。

假设用户刚刚创建了一个新的业务资料帐户,我想在 form.save() 之后预加载使用新的业务 ID 和今天的日期自定义的数据(所以我有可用的新帐户 ID) .

显然,我可以使用硬编码方法并编写 10 行 Model.objects.create(...) 并完成它,但我想知道通过 JSON 固定文件等方式执行此操作的“正确”Django/pythonic 方式是什么.

【问题讨论】:

  • 夹具文件用于测试。
  • 对@DanielRoseman 有什么建议吗?

标签: python mysql json django


【解决方案1】:

如果您只关心创建一个 id,您可以拥有一个允许字段为空且自动 id 字段的模型。其他字段也可以有默认值。默认字段选项也允许回调。 例如:-

created_at = models.DateTimeField(default=datetime.now)

看:https://docs.djangoproject.com/en/1.9/topics/db/models/#field-options

具有所有可空字段或默认值字段的模型基本上可以使用 form.save() 中的一行代码创建。假设您打算只创建一个默认模型对象。

至于正确的方法,您可能希望在模型和正确的关系(FK)中有简单的标志(将业务配置文件记录为活动,而将默认的业务配置文件不活动等),以便用户无法重复创建默认业务个人资料。

【讨论】:

  • 感谢您的反馈。不幸的是,这不仅仅是设置今天的日期,因为我需要能够添加其他变量。顺便说一句,我通常使用auto_now_add=True
  • auto_now_add=True 似乎比使用 default=datetime.now 更好。我只是想传达对默认值进行回调的可能性。回调可以有任何类型的复杂逻辑来达到特定实例的默认值。
【解决方案2】:

您可以使用 django post_save 信号。它易于使用。

https://docs.djangoproject.com/en/1.9/ref/signals/#django.db.models.signals.post_save

您可以将代码放在该应用程序本身的 models.py 中。

@receiver(post_save,sender=ModelName)
def do_some_operation(sender, **kwargs):
    if kwargs['created']:                 # Executes only if created 
        obj = kwargs['instance']
        # do modifications with your obj
        obj.save()

【讨论】:

  • 谢谢!我去看看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 2017-07-11
相关资源
最近更新 更多