2011-03-30 23 views
5

Vì vậy, trong django chúng tôi viếtTại sao django phải sử dụng dấu gạch dưới kép khi thực hiện truy vấn bộ lọc?

Entry.objects.filter(blog__id=3) 

nào trông xấu xí bởi vì đôi khi có quá nhiều dấu gạch

Entry.objects.filter (blog_something_ nhấn _too_ nhiều _id = 3)

tại sao django không thể sử dụng cú pháp như

[entry.objects if blog.id=3 ] 

?

Tôi không phải là chuyên gia về điều này, nhưng tại sao phải tăng gấp đôi gạch dưới? Có thể có một phong cách thanh lịch hơn trong ngữ pháp của python để viết cái này không?

+0

Tôi không tìm thấy bất cứ điều gì sai trái với nó, nhưng tôi tò mò về bất kỳ lựa chọn thực tế và sạch sẽ khác. Việc chuyển đối số cho hàm python là một phần cực kỳ cơ bản của ngôn ngữ và các tác giả đã tận dụng các tên đối số từ khóa. 'fields_and_lookups = kwarg.split ('__')' –

Trả lời

9

Django chạy trên Python, mà đặt ra một số hạn chế cơ bản khi nói đến cú pháp, làm cho cú pháp sau đề nghị bất khả thi (Python không cho phép nhiều lại định nghĩa của cú pháp cơ bản):

[entry.objects if blog.id=3 ] 

Ngoài ra, " blog "và" id "không phải là đối tượng, chúng đề cập đến tên trong cơ sở dữ liệu, vì vậy việc giải quyết các tên này là blog.id cũng có vấn đề. Trừ khi tất nhiên nó được nhập như là một chuỗi, mà thực sự là những gì đang được thực hiện nhìn thấy như là đối số từ khóa được thông qua như là một đối tượng từ điển trong Python. Nó có thể đương nhiên được thực hiện theo những cách khác, đây là một ví dụ về cách sử dụng dấu chấm như dải phân cách:

def dotstyle(dict): 
    retdict = {} 
    for key, value in dict.items(): 
     retdict[key.replace(".", "__")] = value 
    return retdict 

Entry.objects.filter(**dotstyle({"blog.id": 3}) 

Bằng cách kết hợp này với chức năng lọc trong Django, chúng ta có thể loại bỏ các chức năng dotstyle và vụng về **, nhưng chúng tôi vẫn còn lại với niềng răng từ điển, đó có lẽ là lý do tại sao họ đã đi với các dấu gạch dưới đôi để thay thế.

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