在模型创建上创建OneToOne实例

时间:2011-04-09 21:21:51

标签: django django-models

我正在构建我的第一个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)吗?

3 个答案:

答案 0 :(得分:31)

实现这一目标的最常见方法是使用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 :(得分:7)

一个优秀的django-annoying插件可以AutoOneToOneField解决这个问题。我正在使用它来处理我工作的所有django项目中的用户配置文件。

答案 2 :(得分:3)

一种方法是使用下一个处理程序注册post_save信号:

def user_save(sender, instance, created, **kwargs):
  if created:
     FavouriteList.objects.get_or_create(user=instance)