如何在 Django 中为模型创建初始值?

How can I create initial values for a model in django?

每次注册新用户我都想创建两个邮件文件夹:草稿和已删除,还允许用户创建自己的文件夹。

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

Antoher 的替代方案是提供默认文件夹值并允许用户添加自己的新文件夹。

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)

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

下面是一个示例,其中 运行 一些函数用于在订单 saved/deleted 商品时重新计算内容。

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

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

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

感谢@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