在Django管理面板中设置自定义SQL

3 投票
2 回答
1753 浏览
提问于 2025-04-15 23:46

我正在尝试在Django的管理后台设置一个代理模型。这个代理模型将代表原始模型的一部分。以下是models.py中的代码:

class MyManager(models.Manager):
    def get_query_set(self):
        return super(MyManager, self).get_query_set().filter(some_column='value')

class MyModel(OrigModel):
    objects = MyManager()
    class Meta:
        proxy = True

现在,我需要用一个复杂的SELECT语句和连接(JOINS)来替代filter()。请问如何将这个复杂的查询完整地放入自定义管理器中呢?

2 个回答

1

如果你想在 MyModel.objects 中进一步使用 ORM(对象关系映射),那么使用原始 SQL 不是一个好办法。因为在使用原始 SQL 的时候,它只提供了一个迭代器。

你不能在 MyModel().objects 上进行链式操作,比如过滤、排除等等。如果在管理后台可以做到这些,比如过滤功能在这里就无法使用。如果你需要这些功能,唯一的选择就是不要在你的管理器的 get_query_set 方法中使用原始 SQL。

我不确定在管理后台是否可以使用 Manager.raw。

2

Django 提供了一个叫做 extra() 的 QuerySet 修改器——它可以让你在 QuerySet 生成的 SQL 语句中插入特定的条件。

这个功能可以用在一些复杂的情况中,可能需要一个或多个额外的查询。

撰写回答