2012-02-09 71 views
0

Python和Django的新手問題,這裏是代碼:檢查對象,從基類的收集獲得,是子類的對象在Django

class Client(User) 
    #some fields 

client=Client() 
client.save() 

user=User.objects.all()[0] 

#want to ckeck type of user, expect that it is Client: 
isinstance(user,Client) #returns false 

#but this works: 
isinstance(user,User) #returns true 

但我想到的是用戶客戶端。怎麼了?

增加: 需先子類對象,並能正常工作:

if hasattr(user,'client'): 
     client=user.client 

加2:傢伙,你這麼生氣,所以我不敢張貼任何更多的在這個問題:)它是封閉的,我完全理解我對django,python,polymorphism和其他IT技術的知識絕對真空,謝謝))

+2

你做錯了。 Django有一個「組」模型,可以讓你區分不同類型的用戶。不要像這樣繼承Django的'User'類。閱讀這樣的問題:http://stackoverflow.com/questions/4789021/in-django-how-do-i-check-if-a-user-is-in-a-certain-group。這是正確的方法。刪除所有嘗試子類User的代碼。關閉這個問題。並正確使用「Group」重新開始。 – 2012-02-09 10:49:15

+0

爲什麼不要子類用戶? Django允許:https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance。我需要擴展用戶自定義字段,所以沒有什麼是與子類綁定。 – 2012-02-09 11:30:11

+0

但用於區分的組看起來很好,我使用它,謝謝 – 2012-02-09 11:33:40

回答

2

問題是Django的查詢集不知道繼承。所以當你在User上查詢時,它不會返回子類。

最簡單的解決辦法是做這樣的事情:

try: 
    client = user.client 
except Client.DoesNotExist: 
    # handle exception 

當然,如果你有用戶的多個子類,這個稍微複雜獲得。有很多方法可以讓Django正確地進行模型繼承,但它們都有點冒失。

0

你的期望是錯的。你查詢User班,你爲什麼期望得到一個Client?!