2012-02-09 72 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?!