Django模型的自定义SQL

1 投票
1 回答
1310 浏览
提问于 2025-04-17 10:03

先说一下背景...

我正在尝试创建一个自定义的认证后端,并扩展用户模型。我用的参考资料是:

Scott Barnham的博客文章

不知道为什么,ORM(对象关系映射)生成了无效的SQL语句。它似乎想要进行自我连接,但找不到名为user_ptr_id的字段,所以连接失败了。

如果你搜索一下这个问题,发现我可能不是唯一遇到这个问题的人。其实在上面那篇博客的评论中也提到过这个问题。不过,我似乎找不到解决办法。

看起来我应该能够覆盖生成的SQL,这样对吗?根据我的理解,似乎可以通过自定义对象管理器来实现。对吗?

但是,我找不到一个好的例子来说明我想做的事情。我看到的所有例子都是想要继承和链接,这并不是我想要的。我只是想说:

嘿,Django!在选择时,使用这个SQL语句。等等。

这样做可能吗?也许今天我的“谷歌搜索”不太灵光,但我找不到相关的信息。这让我觉得我可能用错了术语或者其他什么。

请注意:我使用的是Django 1.3.1,Python 2.6.5和PostgreSQL 9.1

1 个回答

0

大卫,

没错,你可以通过在对象中实现一个重写的管理器来改变模型的行为。我找到了一篇很棒的博客,作者是Greg Allard,内容是关于Django模型管理器的软删除记录,它讲解了如何进行软删除,也就是把一个字段deleted设置为真或假,并且只显示没有被删除的对象,或者显示所有对象,包括被删除的。

考虑到这一点,我觉得你可以重写你对象的all()或filter()方法来实现你想要的效果。顺便提一下,每次我使用指针的时候,字段名中都会有“ptr”,这是因为类的继承。例如,class Animal():...class Man(Animal):,这里的Man是Animal的子类。在数据库中,Man表会有一个animal_ptr_id,这个字段“扩展”了animal表的记录,用这个id作为Man,同时包含了动物和人类的字段。

撰写回答