2017-02-22 87 views
16

是否可以使用Python类型提示指定Django QuerySet中的记录类型?像QuerySet[SomeModel]如何在Django QuerySet中使用Python类型提示?

例如,我们有型号:

class SomeModel(models.Model): 
    smth = models.IntegerField() 

而且我们想通过这种模式的查询集为PARAM在FUNC:

def somefunc(rows: QuerySet): 
    pass 

但如何在查询集指定的记录类型,如与List[SomeModel]

def somefunc(rows: List[SomeModel]): 
    pass 

但用QuerySet?

回答

-5

如果你想传递一个PARAM只是这样做:

def somefunc(smth): 
    pass 

,如果你想返回一个列表型使用功能list()

+0

我希望使用'smth'的类型提示并指定'smth:QuerySet',但是如何在QuerySet中指定记录类型? –

+0

检查这两个问题,他们可能会包括你的答案。 1)http://stackoverflow.com/questions/32557920/what-are-type-hints-in-python-3-5 2)http://stackoverflow.com/questions/35230635/type-hinting-in-python -2 – ALJ

+4

这不是关于如何传入参数的问题。 OP询问如何为只能接受Django QuerySet对象的函数参数指定[PEP 484 type hints](https://www.python.org/dev/peps/pep-0484/)。 –

4

一个解决方案可能使用联合打字类。

from typing import Union, List 
from django.db.models import QuerySet 
from my_app.models import MyModel 

def somefunc(row: Union[QuerySet, List[MyModel]]): 
    pass 

现在,当你切的row参数就会知道,返回类型是为MyModel的另一个列表或为MyModel的一个实例,同时也暗示了QuerySet类的方法都可以在row说法太。

0

我正在寻找解决方案。 Django Developers列表中有一个thread,他们正在讨论如何实现这样的功能。

他们目前正在开发一个Django extension to mypy,但看起来我们可能对我们的具体要求不太好。在“可能从来没有”标题下的路线图:

查询集可能有一些部分支持,但复杂的参数(如 用于过滤的那些,并得到查询)或Q和F对象超出 表现现在是mypy的可能性。

说明,我们将不得不使用普通油墨QuerySet,直到条件改善。