İlk örneğiniz multi-table inheritance. Eğer bir profile
varsa
class Profile(User):
, doğrudan kullanıcı modeline tüm alanları erişebilirsiniz (örn profile.username
ve profile.email
). Bu durumda, Django otomatik olarak sizin için bir OneToOneField
oluşturur.
İkinci örnek düzenli bir OneToOneField
.
class Profile(models.Model):
user = models.OneToOneField(User)
Bu durumda,
profile.username
ve
profile.email
erişemez. Bunun yerine, bu alanlara bire bir alana (ör.
profile.user.username
ve
profile.user.email
) erişirsiniz.
Bir profil modeli eklediğiniz durumda, miras kullanmamaya ve bunun yerine bire bir alanı kullanacağım. User
modelinde, parolaları işlemek için özel yöneticiler bulunur. Çok masalı devralma kullanırsanız, Profile
modelinizin de bununla ilgilenmesi gerekir. Bire bir alanı kullanarak, özel yöneticiler kullanıcı alanlarını işleyebilir ve Profil model yöneticileriniz yalnızca ek profil alanlarını işlemek zorundadır.
Başka bir seçenek de custom user model oluşturmaktır. Bu durumda, User
sınıfının yerine bir soyut sınıf AbstractUser
veya AbstractBaseUser
alt sınıfını sınıflandırırsınız. Profil sınıfınız çalışıyorsa, özel kullanıcı modelleri yerine özel kullanıcı modellerinin kurulması daha karmaşık olduğundan, bunu özel kullanıcı modeli yerine öneriyorum.
Bunun bir kopyası olduğunu söyleyeceğim [Django: Neden auth.User alt sınıflandırma yerine UserProfile bir CreateOfile oluşturuyorsunuz?] (Http://stackoverflow.com/questions/5452288/django-why-create-a- bir alt-kullanıcı-kullanıcı-alt-yerine-alt-sınıflandırma-auth-kullanıcı) çünkü en iyi cevap orada "başlık altında" şeyler hakkında konuşur. Ayrıca bkz. Https://stackoverflow.com/questions/3221745/django-when-extending-user-better-to-use-onetoonefielduser-ve-foreignkeyuse –
Nedenini bilmek istemiyorum ama kaputun altında ne olur? @Alasdair cevapladı. – mazulo