繁体   English   中英

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

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

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

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

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

型号

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模型的信号来自动创建信号。

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

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

多年来,我已经意识到信号的一个问题是它们易于执行,但它们是同步的。

我个人将使用子进程或建议使用线程来克服使它感觉像异步的局限性。 或最好是您可以拥有一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM