将现有模型迁移到Django内置的用户模型

4

我正在运行一个Django 1.4.2项目。我有一个类为User(models.Model)的数据库,并且现在想要更改这个模型,以便使用django.contrib.auth.models中内置的模型User。我可以简单地使用现有代码并使我的自定义User模型成为Django内置模型的子类吗?以下是现有的模型。

class User(models.Model):
    u_id = models.AutoField(primary_key=True)
    #password = models.CharField(max_length=765)
    old_password = models.CharField(max_length=765, null=True, blank=True)
    birthday = models.DateField(null=True, blank=True)
    school_year = models.CharField(max_length=765, blank=True)
    gender = models.CharField(max_length=18, blank=True)
    #email = models.CharField(max_length=765, blank=True)
    profile_pic = models.CharField(max_length=765, blank=True)
    is_cloudinary_pic = models.BooleanField(default=False)
    fb_id = models.CharField(max_length=765, blank=True)
    phone_num = models.CharField(max_length=765, blank=True)
    name = models.CharField(max_length=765, blank=True)
    confirmcode = models.CharField(max_length=765, blank=True)
    status = models.CharField(max_length=765, blank=True)
    netid = models.CharField(max_length=765, blank=True)
    favorites = models.ManyToManyField('listings.Listing', blank=True, related_name='favorites')
    stripe = models.CharField(max_length=765, blank=True)
    rating = models.IntegerField(null=True, blank=True)
    preferences = models.CharField(max_length=765, blank=True)
    b_notification = models.CharField(max_length=765, blank=True)
    l_notification = models.CharField(max_length=765, blank=True)
    address = models.CharField(max_length=765, blank=True)
    city = models.CharField(max_length=765, blank=True)
    state = models.CharField(max_length=6, blank=True)
    zip = models.CharField(max_length=15, blank=True)
    emailprefs = models.CharField(max_length=30, blank=True)
    exp_month = models.CharField(max_length=6, blank=True)
    exp_year = models.CharField(max_length=12, blank=True)
    last4 = models.CharField(max_length=12, blank=True)
    c_type = models.CharField(max_length=765, blank=True)
    user_type = models.CharField(max_length=10, blank=True)
    contract = models.ForeignKey('contracts.Contract', null=True,blank=True, default=None, on_delete=models.SET_NULL)
    last_listing_booked = models.ForeignKey('listings.Listing', null=True,blank=True, default=None, on_delete=models.SET_NULL, related_name='last_listing_booked')
    last_locked_on = models.IntegerField(null=True, blank=True)
    waitlist_number = models.IntegerField(null=True, blank=True)
    waitlist_listing = models.ForeignKey('listings.Listing', null=True, blank=True, on_delete=models.SET_NULL, related_name='waitlist_listing')
    uploaded_contract = models.FileField(upload_to=contract_file_name, max_length=765, null=True, blank=True, default=None, storage=FileSystemStorage(location=os.path.join(MEDIA_ROOT, 'contracts')))

当我尝试使用Django South进行迁移时,将我的模型设为Django用户模型的子类后,我被要求设置user_ptr的值,这是一个关于它我无法找到任何信息的字段。

一般来说,简单地采用这种子类化方式是否不安全?我不能承受失去已经拥有的所有用户数据并重新开始。请注意,密码和电子邮件字段被注释掉,因为它们与Django版本的这些字段冲突。

2个回答

4
如果升级到Django 1.5是一个选项,那么您可以简单地使用自己的用户模型,只要它提供了所有必需的字段。点击此处获取更多信息。 user_ptr是一个隐式的OneToOne模型,将您的对象与您正在派生的类相关联。最简单的方法可能是按照以下步骤手动创建迁移:
  1. 添加 user_ptr 字段,并设置 null=True。

  2. 迭代所有 User 对象并创建相应的 auth.User 对象。如果不确定如何执行此操作,请阅读South文档中的数据迁移部分

  3. 禁止空的 user_ptr 字段。

如果您使用的哈希方案与Django内置的方法不兼容,则可能需要实现自己的密码哈希器。这不是很难做到,并在另一个问题中有所讨论。

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接