2010-02-07 17 views
5

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.

Trả lời

3

Bạn có thể nhận kết quả mong muốn bằng cách chỉ định các trường mong muốn thông qua mệnh đề fields = của trình xử lý.

lĩnh vực mẫu đến từ các phím nước ngoài có thể được xác định như thế này:

('foreign_model_field', ('nested_field1', 'nested_field2')) 

Trong trường hợp của bạn, sau đây nên làm việc (một số lĩnh vực của bạn bỏ qua cho ngắn gọn):

fields = ('updated', 'expires', 'created', 
    ('request', ('incident', 'reason', ('inputter', ('username',))))) 
+0

Đ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

3

Bạn có thể thử sử dụng bao gồm thay vì loại trừ không? Ví dụ.

include = (('request', ('inputter', ('username', 'therestofthefields')))) 

Tôi không nhớ mình có viết exclude linh hoạt như include hay không.

Ngoài ra, nhóm Google django-piston là nơi chúng tôi thảo luận hầu hết mọi thứ, bạn có thể có nhiều thành công hơn khi đặt câu hỏi này ở đó.

+0

Cám ơn chim ưng, Jesper. Tôi sẽ lừa nó trong danh sách gửi thư. – jathanism

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