2015-10-06 7 views
5

Sistemimde kullanıcıları uygulamak istiyorum. Django'nun zaten bir kimlik doğrulama sistemine sahip olduğunu biliyorum ve belgeleri okuyordum. Ama bir ya da böyle, ama ne davlumbaz altında olur kullanmayı neden bilmek istemiyorumDavlumbazlar altında, kullanıcıyı alt sınıflandırma ile bire bir alan oluşturma arasındaki fark nedir?

from django.contrib.auth.models import User 
class Profile(User): 
    # others fields 

Ve

from django.contrib.auth.models import User 
class Profile(models.Model): 
    user = models.OneToOneField(User) 
    # others fields 

arasında henüz farkı bilmiyorum. Fark ne?

+0

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 –

+0

Nedenini bilmek istemiyorum ama kaputun altında ne olur? @Alasdair cevapladı. – mazulo

cevap

9

İ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.

+0

Sonunda farkı anladım! Kullanıcıdan miras aldığınızda Django'nun bir "OneToOneField" oluşturduğunu bilmiyordum. Çok masalı mirasın ne anlama geldiğini bilmiyorum, ancak ilgili linki okuyacağım. Teşekkürler! – mazulo

İlgili konular