2012-05-08 76 views
2

我有一個連接到它,像這樣一些額外的權限Django的auth用戶代理模型:指定代理模型實例外鍵

class User(User): 
    class Meta: 
     proxy = True 
     permissions = (
      ("write_messages","May add new messages to front page"), 
      ("view_maps","Can view the maps section"), 
     ) 

其他地方的模式,我有一個具有用戶作爲對象外鍵:

class Project(models.Model): 
    creation_date = models.DateTimeField(auto_now_add=True) 
    modify_date  = models.DateTimeField(auto_now=True) 
    owner   = models.ForeignKey(User) 

在我的觀點一個我嘗試使用當前用戶作爲所有者

@login_required 
def new_project(request): 
    project = Project.objects.create(owner=request.user) 
創建一個新項目210

然而,這將返回錯誤:

Cannot assign "<User: mwetter>": "Project.owner" must be a "User" instance. 

我假設在項目對象中的外鍵業主指的Django的用戶,而不是我的代理類的基類。有沒有辦法將我的代理用戶作爲外鍵引用?

+0

可能的重複http://stackoverflow.com/questions/3006753/how-to-convert-request-user-into-a-proxy-auth-user-class – San4ez

回答

2

爲什麼你打電話給你的代理類User,這是保證導致混淆和django.contrib.auth.models.User?爲什麼不是UserProxyMyUser?然後,無論何時使用它,都可以進行區分。

+0

嗯,這實際上是一個很好的觀點。到目前爲止,除了user.has_perm()這樣的內置函數之外,我還沒有使用'User'。我不記得我使用同一個名字的原始推理,所以我會嘗試改變它以查看什麼是休息。 –

+0

我將接受這個作爲我應該採取的明顯步驟的最佳答案。在這一點上,我正在鑽研擴展用戶模型的叢林以及它帶來的所有喜悅。 –

0

嘗試分配的,而不是對象

project = Project.objects.create(owner_id=request.user.pk) 
17

除了什麼@DavidRobinson說ID,你需要小心有關創建外鍵的代理模式。代理模型仍然是它所代表模型的一個子類,儘管所有意圖和目的都與模型相同。如果您有代理的外鍵,它將不會接受基類,但基類的外鍵將接受該代理。以下面爲例。

考慮:

class UserProxy(User): 
    class Meta: 
     proxy = True 
    ... 

class User(models.Model): 
    ... 

下將引發異常:

class SomeModel(models.Model): 
    user = models.ForeignKey(UserProxy) 

user = User.objects.get(username='some_user') 
instance = SomeModel.objects.create(user=user) 

但是,下面將正常工作:

class SomeModel(models.Model): 
    user = models.ForeignKey(User) 

user = UserProxy.objects.get(username='some_user') 
instance = SomeModel.objects.create(user=user) 

這是由於的方向性關係。 UserProxyis-aUser,但User而不是 a UserProxy

+0

雖然我接受了DavidRobinson的回答,但是感謝您提供額外的信息。 –