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 User モデルのサブクラスにした後、Django South を使用して移行しようとすると、user_ptr の値を設定するように求められます。このフィールドに関する情報は見つかりませんでした。

一般に、この方法で単純にサブクラス化するのは安全ではありませんか? すでに持っているすべてのユーザー データを失い、最初からやり直すわけにはいきません。パスワードとメールのフィールドは、Django のバージョンのフィールドと競合するため、コメント アウトされていることに注意してください。

4

2 に答える 2

4

Django 1.4 を使用している場合は、UserProfileからサブクラス化するのではなく、モデルを作成する必要がありますdjango.contrib.auth.models.User。Django の User クラスを直接拡張すると、内部の django.auth メカニズムであらゆる種類の問題が発生する可能性があります。

django でユーザー プロファイルを実装する方法の詳細については、 http: //www.turnkeylinux.org/blog/django-profile を参照してください。

Django 1.5 には、 Vinay Paiによる別の回答で述べられているように、構成可能なユーザー モデルがあります。

于 2013-01-11T20:37:00.630 に答える
4

Django 1.5 へのアップグレードがオプションである場合、すべての必須フィールドを提供する限り、独自の User モデルを使用できます。

user_ptr は、オブジェクトを派生元のクラスに関連付ける暗黙の OneToOne モデルです。これを行う最も簡単な方法は、次の手順で移行を手動で作成することです。

  1. user_ptr フィールド WITH null=True を追加します

  2. すべての User オブジェクトを繰り返し処理し、対応する auth.User オブジェクトを作成します。これを行う方法がわからない場合は、South ドキュメントのデータ移行に関するセクションを参照してください。

  3. null の user_ptr フィールドを許可しない

使用したハッシュ スキームが Django の組み込みメソッドと互換性がない場合は、独自のパスワード ハッシュを実装する必要があるかもしれません。これはそれほど難しいことではなく、別の質問で対処します。

于 2013-01-11T20:20:44.260 に答える