在Django管理面板中设置自定义SQL
我正在尝试在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 语句中插入特定的条件。
这个功能可以用在一些复杂的情况中,可能需要一个或多个额外的查询。