【问题标题】:Django - creating model instance when user is createdDjango - 创建用户时创建模型实例
【发布时间】:2021-06-19 01:10:09
【问题描述】:

首先,我找到了一些以前的解决方案,但它们已经过时了,不推荐用于当前版本的 Django。我想要做的是我有一个通过外键关系绑定到用户的监视列表模型,我想要的是在每次创建用户时创建一个监视列表,以便它自动绑定到所述用户。我有一些模型和模型管理器,但我真的不知道如何连接它们,希望能得到一些帮助。我已经尝试了一些方法,但最终都创建了用户,但没有创建关注列表。

class UserMananger(BaseUserManager):

def create_user(self, email, password=None, **extra_fields):
    """create and save new user"""
    if not email:
        raise ValueError("Users must have an email address")
    user = self.model(email=self.normalize_email(email), **extra_fields)
    user.set_password(password)
    user.save(using=self.db)
    return user


class User(AbstractBaseUser, PermissionsMixin):
"""User model"""

email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)

objects = UserMananger()

USERNAME_FIELD = 'email'


class WatchlistManager(models.Manager):
"""manage creating watchlists"""

def create_watchlist(self, user):
    watchlist = self.create(user=user)
    watchlist.save()

    return watchlist


class Watchlist(models.Model):
"""Watchlist model"""
watchlist_id = models.AutoField(primary_key=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL,
                         on_delete=models.CASCADE)
products = models.ManyToManyField('Product')

def __str__(self):
    return f'{self.watchlist_id} {self.user}'

【问题讨论】:

    标签: django


    【解决方案1】:

    你应该使用 django 信号

    在您的模型中放置该代码 .... 如果您更改了默认用户模型,请将其从 sender=User 更改为 sender=yourModel

    from django.dispatch import receiver
    from django.db.models.signals import post_save
    from django.contrib.auth.models import User
    
    
    
     """
       models
     """
    
    
    @receiver(post_save, sender=User)
    def watchlist_create(sender, instance=None, created=False, **kwargs):
        if created:
            watchlist.objects.create(user=instance,)
    

    现在每次创建用户时,都会使用同一用户创建一个关注列表,您可以在 create 方法中添加更多字段...即使您创建了一个超级用户,也会创建命令行关注列表

    【讨论】:

    【解决方案2】:

    如果每个用户都有一个关注列表,那么您不应该通过 ForeignKey 连接模型。您应该改用 OneToOneField。 除非单个用户可以拥有多个关注列表,否则在这种情况下 ForeignKey 连接是正确的。

    我不熟悉管理器的使用,但我认为没有必要朝那个方向发展。如果我是你,我会改用信号。您设置信号来监视数据库中正在创建的新用户,当他们出现时,您会自动创建一个监视列表并将其附加到该特定用户。

    或者,您可以在 Django 源代码中查找 SignUp 类并部分覆盖它,以便在每次用户注册时创建一个关注列表条目。

    您可能还想考虑使用 celery 在后台运行这些任务,而不影响用户体验。

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 2017-12-21
      • 2023-03-23
      • 1970-01-01
      • 2015-05-31
      • 2011-08-02
      • 2021-03-09
      相关资源
      最近更新 更多