如何在 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
每次注册新用户我都想创建两个邮件文件夹:草稿和已删除,还允许用户创建自己的文件夹。
如何覆盖用户注册以便为每个新用户创建两个文件夹?
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