2017-02-22 16 views
16

Có thể chỉ định loại bản ghi trong Django QuerySet với gợi ý kiểu Python không? Một cái gì đó như QuerySet[SomeModel]?Làm thế nào để sử dụng gợi ý loại Python với Django QuerySet?

Ví dụ, chúng ta có mô hình:

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

Và chúng tôi muốn vượt qua QuerySet của mô hình đó như param trong func:

def somefunc(rows: QuerySet): 
    pass 

Nhưng làm thế nào để xác định loại bản ghi trong QuerySet, như với List[SomeModel]:

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

nhưng với QuerySet?

Trả lời

-5

Nếu bạn muốn vượt qua một param chỉ làm điều này:

def somefunc(smth): 
    pass 

nếu bạn muốn trả về một hàm sử dụng loại danh sách list().

+0

Tôi muốn sử dụng gợi ý loại cho 'smth' và chỉ định' smth: QuerySet', nhưng cách chỉ định loại bản ghi trong QuerySet? –

+0

kiểm tra hai câu hỏi này, chúng có thể bao gồm câu trả lời của bạn. 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

Đây không phải là câu hỏi về cách chuyển các tham số. OP là yêu cầu làm thế nào để xác định [PEP 484 loại gợi ý] (https://www.python.org/dev/peps/pep-0484/) cho một tham số chức năng mà chỉ có thể chấp nhận một đối tượng Django QuerySet. –

4

Một giải pháp có thể đang sử dụng lớp nhập Union.

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 

Bây giờ khi bạn cắt lập luận row nó sẽ biết rằng các loại trở lại là một trong hai một danh sách của MyModel hoặc một thể hiện của MyModel, trong khi cũng gợi ý rằng các phương pháp của lớp QuerySet có sẵn trên lập luận row quá .

0

Tôi cũng đang tìm giải pháp cho vấn đề này. Danh sách Nhà phát triển Django có một số thread, trong đó họ đang thảo luận cách triển khai tính năng như vậy.

Họ hiện đang phát triển một Django extension to mypy, nhưng có vẻ như chúng tôi có thể không may mắn cho yêu cầu cụ thể của chúng tôi. Trong lộ trình của họ dưới tiêu đề của "Có lẽ Never":

queryset thể có một số hỗ trợ một phần, nhưng lập luận phức tạp (như những người cho bộ lọc và nhận được truy vấn) hoặc Q và các đối tượng F nằm ngoài biểu cảm khả năng của mypy như bây giờ.

Nói rằng, chúng tôi sẽ chỉ phải sử dụng đồng bằng ole QuerySet cho đến khi điều kiện được cải thiện.

Các vấn đề liên quan