我遵循了django-ldapdb中的说明,但我似乎无法让django-ldapdb表现得像是在进行README查询。使用Python 3.7在全新的Django v.2.1.2实例上编辑了以下内容:
对settings.py的更改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'ldap': {
'ENGINE': 'ldapdb.backends.ldap',
'NAME': 'ldaps://my.server',
'USER': 'cn=some user',
'PASSWORD': 'somePassword',
}
}
DATABASE_ROUTERS = ['ldapdb.router.Router']新的models.py
class MyPerson(ldapdb.models.Model):
base_dn = "ou=people,dc=ucsf,dc=edu"
object_classes = ['person', 'myPerson]
uid = fields.IntegerField(db_column='uid')
displayname = fields.CharField(db_column='displayname')
eid = fields.CharField(db_column='eid')
def __str__(self):
return str(self.uid)
def _unicode__(self):
return str(self.uid)我视图中的查询。首先,我尝试了:
result = MyPerson.objects.filter(uid=99894)然后我试着:
result = MyPerson.objects.using('ldap').filter(uid=99894)在PyCharm的调试器中运行Django dev服务器,我可以看到result接收到一个QuerySet,其中包含以下消息:
Unable to get repr for <class 'django.db.models.query.QuerySet'>我说的“消息”是什么意思。老实说,我不确定,但调试器显示:

此外,似乎QuerySet的db成员是' LDAP ',并且query成员显示的是SQL查询,而不是LDAP筛选器。当我通过URL路由跟踪HTTP请求、视图、查询,然后是结果时,我从未见过它发出任何与LDAP相关的调用。另外,我破坏了LDAP绑定密码,并且没有收到绑定错误。我很确定我错过了一些让Django知道我想在这一点上使用LDAP的东西...我只是不知道那是什么。
发布于 2018-11-14 08:48:31
由于LDAPdoes不代表关系数据库,并且通常具有通过配置创建的模式,而不是通过查询创建的模式,因此我从来没有意识到我需要运行manage.py makemigrations和manage.py migrate。(我对Python比较陌生,对Django更是如此。(我过去为LDAP使用和扩展的多数据源ORM不需要类似的准备工作。)凭直觉,我对我的LDAP模型运行了manage.py命令,然后再次尝试我的代码。现在它起作用了。
我在PHP Symfony上工作了几年,还写过ucsf-iam/UcsfLdapOrm。虽然Symfony也有一个数据库迁移过程,因为LDAP模式是相当静态的,当我写LDAP ORM时,我硬编码了Django迁移动态处理的一部分。其余部分由模型类中的PHP注释处理,类似于Django具有pythonic字段类型并将它们与LDAP属性类型相关联。现在我更好地理解了这一切,我对Django如何设置ORM有了更深的理解。
我希望这对其他转向Python和Django的LDAP开发人员有指导意义。
https://stackoverflow.com/questions/53291103
复制相似问题