【问题标题】:Check if object, obtained from collection of Base class, is object of subclass in Django检查从基类集合中获得的对象是否是 Django 中子类的对象
【发布时间】:2012-03-01 19:56:52
【问题描述】:

Python 和 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、多态性和其他知识方面的绝对真空IT 技术,谢谢 ))

【问题讨论】:

  • 你做错了。 Django 有一个“组”模型,可以让您区分不同类型的用户。不要像这样子类化 Django 的 User 类。阅读这样的问题:stackoverflow.com/questions/4789021/…。这才是正确的做法。删除所有试图继承User 的代码。关闭这个问题。并正确使用Group 重新开始。
  • 为什么不继承用户? Django 允许它:docs.djangoproject.com/en/dev/topics/db/models/…。我需要使用自定义字段来扩展用户,所以子类化没有任何问题。
  • 但是用于区分的组看起来不错,我用那个,谢谢
  • “需要使用自定义字段扩展用户”。这就是为什么用户有一个“个人资料”扩展名。阅读:docs.djangoproject.com/en/1.3/topics/auth/…。不要子类化用户。而且 - 一般来说 - 子类的工作方式与您在问题中描述它们的方式不同。如果你认为你需要使用isinstance,那你就没有理解多态性。根据您的需要,只需阅读有关组和配置文件的 Django 文档。

标签: python django inheritance


【解决方案1】:

问题是 Django 的查询集不知道继承。因此,当您查询 User 时,它永远不会返回子类。

最简单的解决方案是这样做:

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

当然,如果您有多个 User 子类,这会稍微复杂一些。有一些方法可以让 Django 正确地进行模型继承,但它们都有点 hacky。

【讨论】:

    【解决方案2】:

    你的期望是错误的。你查询 User 类,你为什么期望得到一个 Client 呢?!

    【讨论】:

      猜你喜欢
      • 2018-09-10
      • 1970-01-01
      • 2011-02-08
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2010-09-23
      相关资源
      最近更新 更多