在模型创建时创建 OneToOne 实例
Posted
技术标签:
【中文标题】在模型创建时创建 OneToOne 实例【英文标题】:Create OneToOne instance on model creation 【发布时间】:2011-08-02 06:06:53 【问题描述】:我正在构建我的第一个 django 应用程序。我有一个用户,该用户有一个收藏夹列表。用户只有一个收藏夹列表,并且该列表专属于该用户。
class User(models.Model):
name = models.CharField(max_length=200)
class FavouriteList(models.Model):
user = models.OneToOneField(User)
favourites = models.ManyToManyField(Favourite, blank=True)
创建新用户时,我想确保该用户拥有FavouriteList
。我查看了 Django 文档,但运气不佳。
有谁知道我如何确保模型在创建时具有子对象(例如FavouriteList
)?
【问题讨论】:
Can Django automatically create a related one-to-one model?的可能重复 【参考方案1】:最常用的方法是使用 Django 信号系统。您可以将信号处理程序(只是某处的函数)附加到 User 模型的 post_save 信号,并在该回调中创建您的收藏夹列表。
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
@receiver(post_save, sender=User)
def create_favorites(sender, instance, created, **kwargs):
if created:
Favorites.objects.create(user=instance)
以上内容改编自Django signals docs。请务必完整阅读信号文档,因为有一些问题可能会困扰您,例如信号处理程序代码应该放在哪里以及如何避免重复处理程序。
【讨论】:
将文档从 1.3 更新到 1.11。dev
文档永远不会过时,但也许那会是更好的编辑【参考方案2】:
一个出色的django-annoying 插件使用AutoOneToOneField
为您解决了这个问题。我将它用于我从事的所有 django 项目中的用户配置文件。
【讨论】:
这很酷……我最近似乎越来越喜欢跳这个圈子了。感谢您的提示。【参考方案3】:一种方法是向下一个处理程序注册post_save 信号:
def user_save(sender, instance, created, **kwargs):
if created:
FavouriteList.objects.get_or_create(user=instance)
【讨论】:
以上是关于在模型创建时创建 OneToOne 实例的主要内容,如果未能解决你的问题,请参考以下文章
Django 1.11 admin:创建 OneToOne 关系,它是 admin 中的对象