Tôi đang đặt các bước hoàn thiện trên một API tôi đã viết cho một ứng dụng Django sử dụng django-piston. API có thể tìm kiếm theo yêu cầu hoặc địa chỉ IP lần lượt là Request
hoặc IPAddress
. Mỗi yêu cầu có thể có 1 hoặc nhiều hơn IPAddress
được liên kết với nó.Django Piston: Làm cách nào để loại trừ các trường lồng nhau khỏi các kết quả xử lý? Thậm chí có thể không?
Vì vậy, ví dụ: tôi có cuộc gọi API sẽ hiển thị tất cả IPAddress
đối tượng khớp với trạng thái hoạt động là "hoạt động", "không hoạt động" hoặc "tất cả" (cho một trong hai). Request
mà mỗi cá thể IPAddress
được liên kết có sẵn dưới dạng IPAddress.request
.
Vấn đề tôi đang gặp phải là Request.inputter
là khóa ngoại đối với trường hợp User
của người đã cấp yêu cầu. Khi kết quả của tôi được trả lại từ trình xử lý tôi đã tạo cho cuộc gọi API này, tất cả các trường từ cá thể User
được hiển thị, bao gồm password
.
Điều này là xấu; Tôi không muốn cái này.
Vì vậy, đây là xử lý của tôi:
class SearchByIPStatusHandler(BaseHandler):
model = IPAddress
allowed_methods = ('GET',)
anonymous = AnonymousIPHandler
def read(self, request, status):
"""
Returns IP addresses based on activity status.
Status: 'active', 'inactive', 'all'
"""
if status == 'all':
return self.model.objects.all()
else:
active = True if (status=='active') else False
return self.model.objects.filter(active=active)
Và đây là một ví dụ về các kết quả từ /api/show/all/
:
<response>
<resource>
<updated>2010-02-05 17:08:53.651729</updated>
<expires>2010-02-12 17:08:23</expires>
<created>2010-02-05 17:08:53.625318</created>
<nexthop>255.255.255.255</nexthop>
<netmask>255.255.255.254</netmask>
<address>2.4.6.80/31</address>
<active>True</active>
<id>4</id>
<request>
<updated>2010-02-05 17:08:53.382381</updated>
<created>2010-02-05 17:08:53.382313</created>
<expires>2010-02-12 17:08:23</expires>
<incident>20100212-badthings-01</incident>
<reason>bad things happened</reason>
<inputter>
<username>jathan</username>
<first_name>Jathan</first_name>
<last_name>McCollum</last_name>
<is_active>True</is_active>
<email>[email protected]</email>
<is_superuser>True</is_superuser>
<is_staff>True</is_staff>
<last_login>2010-02-05 18:55:51.877746</last_login>
<password>[ENCRYPTED STRING I REDACTED]</password>
<id>1</id>
<date_joined>2010-01-28 09:56:32</date_joined>
</inputter>
<requester>joeuser</requester>
<active>True</active>
</request>
</resource>
</response>
Tất cả tôi thực sự muốn trong kết quả là inputter.username
, không phải tất cả các những thứ khác. Tôi đã thử lặp lại khác nhau của việc thực hiện một thuộc tính exclude
trên trình xử lý để không có kết quả. Nếu tôi chỉ cần bỏ qua toàn bộ lĩnh vực yêu cầu, mà hoạt động tốt, như vậy:
Trong handler:
exclude = ('request',)
mà kết quả trong:
<response>
<resource>
<updated>2010-02-05 17:08:53.651729</updated>
<expires>2010-02-12 17:08:23</expires>
<created>2010-02-05 17:08:53.625318</created>
<nexthop>255.255.255.255</nexthop>
<netmask>255.255.255.254</netmask>
<address>2.4.6.80/31</address>
<active>True</active>
<id>4</id>
</resource>
</response>
Nhưng những kết quả này cũng không phải những gì tôi muốn là .
Vì vậy, cuối cùng, câu hỏi của tôi:
lĩnh vực Làm thế nào tôi có thể loại trừ lồng từ kết quả xử lý? Thậm chí có thể không?
Tôi đã cố gắng lặp đi lặp lại nhiều những điều sau đây, tất cả đều hoặc không có kết quả hoặc kết quả ngoài ý muốn:
# try to exclude request.inputter
exclude = (('request', ('inputter',),))
# try to exclude request.inputter.password
exclude = (('request', ('inputter', ('password',))))
tôi cho rằng tôi đang hiểu nhầm hoặc lạm dụng cách loại trừ lĩnh vực được thực hiện trong bối cảnh này Vì vậy, bất kỳ sự giác ngộ nào về chủ đề này đều được đánh giá cao.
Điều đó thực sự hiệu quả. Cảm ơn vì sự trả lời! Tẻ nhạt hơn những gì tôi đã hy vọng (đặc biệt là khi tôi sẽ phải lặp lại điều này qua nhiều trình xử lý), nhưng một giải pháp là một giải pháp! – jathanism