在模型创建时创建 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 中的对象

一对一关联查询注解@OneToOne的实例详解

Django - 将 ForeignKey 关系更改为 OneToOne

Hibernate--对象关系

JPA:OneToOne 关系所有者

具有 OneToOne 关系的两个模型之间的错误(违反完整性约束)