我不是一個經驗豐富的用戶,所以請原諒我,如果我在這裏錯了,但我不知道定義一個名爲User的新模型是個好習慣,django.contrib.auth.models
提供了一個名爲User的基本用戶模型。在我看來,這會讓你陷入潛在的衝突。
既然你想有兩個不同的「類型」的用戶,我會使用舊的方法從相關模型鏈接回來。
from django.contrib.auth.models import User
from django.db import models
class Sender(models.Model):
user = models.OneToOneField(User, related_name='sender')
is_active = models.BooleanField(default=True)
class Owner(models.Model):
user = models.OneToOneField(User, related_name='owner')
is_active = models.BooleanField(default=True)
假設你創建id=1
新的用戶,然後創建一個名爲s
新發件人鍵入該用戶。請記住,s
是發件人對象,而不是用戶對象。
>>s.user
<user: username> #can vary with your own unicode definitions
>>s.user.id
1
>>print hasattr(s.user, 'sender')
True
>>print hasattr(s.user, 'owner')
False
>>print s.is_active
True
>>u = User.objects.get(id=1)
>>u.sender
<Sender: username> #again, what actually displays is controlled by your own 'def __unicode__'
>>print u.sender.is_active
True
>>print hasattr(u, 'sender')
True
>>print hasattr(u, 'owner')
False
然後爲報表模型:
class Report(models.Model):
sender = models.ForeignKey(Sender, related_name='report_sender')
owner = models.ForeignKey(Owner, related_name='report_owner')
編輯回答您的其他問題:你如何確保用戶只有一個發送者或擁有者的模式,但不能兩者兼而有之?
我不知道如何在模型層面上實現這一點。在實踐中,我可以想到的最簡單的方法是防止這個問題成爲問題,當創建新的發件人/所有者時,通過一些自定義表單驗證。如果您要創建一個新的發件人,作爲驗證的一部分,請確保您綁定的用戶尚未擁有與其綁定的所有者模型 - 反之亦然。或者同時創建用戶和適當的配置文件模型。
你可以改變你的用戶登記表有一個額外的領域:
class UserRegistrationForm(UserCreationForm):
CHOICES = (
('s', 'Sender'),
('o', 'Owner'),
)
type = models.ChoiceField(max_length=2, choices=CHOICES)
class Meta: ...
然後,當你正在處理您的視圖形式:
...
if form.is_valid():
u = form.save()
type = form.cleaned_data['type']
if type == 's':
Sender.objects.create(user=u)
elif type == 'o':
Owner.objects.create(user=u)
(我很抱歉,但我不是我可以測試的地方,請告訴我它是否不適合你)
django - polymorhpic可以幫助你創建你的模型/關係嗎? https://github.com/chrisglass/django_polymorphic – dm03514