【问题标题】:How can I create initial values for a model in django?如何在 django 中为模型创建初始值?
【发布时间】:2015-10-28 18:50:22
【问题描述】:

每次注册新用户时,我都想创建两个邮件文件夹:Draft 和 Deleted,并允许用户创建自己的文件夹。

如何覆盖用户注册以便为每个新用户创建两个文件夹?

另一种选择是提供默认文件夹值并允许用户添加自己的新文件夹。

Models.py

class UserFolder(models.Model):
user          = models.ForeignKey(settings.AUTH_USER_MODEL, null = True, blank = True)


class MessageFolder(models.Model):
folder        = models.ForeignKey(UserFolder, null = True, blank = True)
message       = models.ForeignKey(Message, null = True, blank = True)

【问题讨论】:

  • 你看过post_save信号吗?

标签: python django model subclass


【解决方案1】:

您可以使用 django 信号通过监听 user 模型的信号来自动创建这些信号。

下面是一个示例,它运行一些函数以在从订单中保存/删除商品时重新计算内容。

from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver

@receiver((post_save, post_delete), sender='main.OrderItem')
def update_order_when_items_changed(sender, instance, **kwargs):
    order = instance.order
    order.set_weight()
    order.set_total_price()
    order.save()

所以你的可能看起来像这样(未经测试):

@receiver((post_save,), sender='User')
def create_user_folders(sender, instance, created, **kwargs):
   if not created: return
   # generate MessageFolder && UserFolder

【讨论】:

    【解决方案2】:

    多年来我意识到信号的一个问题是 它们很容易实现,但是它们是同步的。

    我个人会使用子进程或建议使用线程来克服让它感觉像asynchronous 的限制。 或者最好你可以有一个 cron 作业来查询数据库并创建文件夹。

    【讨论】:

      【解决方案3】:

      感谢@electrometro 为我指明了正确的方向。这是我的最终工作结果:

      class UserFolder(models.Model):
      user          = models.ForeignKey(settings.AUTH_USER_MODEL, null = True, blank = True)
      name          = models.CharField(max_length = 100)
      
      @receiver((post_save), sender=User)
      def create_user_folders(sender, instance, created, **kwargs):
          if not created: 
              return
          else:
              # generate MessageFolder && UserFolder
              draft_folder = UserFolder(None,instance.pk,"Draft")
              draft_folder.save()
      
              deleted_folder = UserFolder(None,instance.pk,"Deleted")
              deleted_folder.save()
              return
      

      【讨论】:

        猜你喜欢
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 2015-07-05
        • 2018-11-19
        • 1970-01-01
        相关资源
        最近更新 更多