2010-09-13 29 views
5

Sau khi cố gắng làm việc này trong một thời gian và tìm kiếm xung quanh tôi thực sự bối rối nên tôi đang đăng bài ở đây ... Tôi muốn thực hiện một số chức năng trong các lớp mà tôi đang viết cho django càng chung càng tốt vì vậy tôi muốn sử dụng getattr để gọi các chức năng như hình dưới đây một cách chung chung:Python, Django, cách sử dụng getattr (hoặc phương thức khác) để gọi đối tượng có nhiều thuộc tính?

cách tôi làm điều đó mà làm việc (không chung cách):

from django.db.models import get_model 
mymodel = get_model('appname', 'modelname') 
dbobject = mymodel.objects.all() 

một trong những nỗ lực của tôi tạo này một cách chung chung, vẫn không hoạt động, nó trả lại một cái gì đó trở lại nhưng nó không phải là loại đối tượng thích hợp để tôi có thể lấy dữ liệu từ nó (một cuộc gọi cơ sở dữ liệu cho django)

ret = getattr(mymodel,'objects') 
dbobject = getattr(ret,'all') 

Trả lời

12

Bạn quên gọi kết quả.

dbobject = mymodel.objects.all() 

Truy cập phương thức mymodel.objects.all và sau đó gọi phương thức đó.

ret = getattr(mymodel,'objects') 
self.dbobject = getattr(ret,'all') 

truy cập phương thức mymodel.objects.all nhưng không gọi nó.

Tất cả bạn cần là thay đổi dòng cuối cùng để:

self.dbobject = getattr(ret,'all')() 
+0

cảm ơn .. ok Tôi hiểu ngay bây giờ .. Tôi đã thử làm một cái gì đó như thế này trước đây, nhưng đã đưa tất cả vào chỉ một cuộc gọi getattr, tôi hiểu bây giờ tôi chỉ gọi phần 'tất cả' phần còn lại của "phần trước" là đối tượng trong getattr, do đó cần phải được thực hiện riêng biệt, cảm ơn vì đã xóa nó ... Tôi đã nghĩ mình có thể làm: dbobject = getattr (model, 'objects.all')() nhưng điều này đã không làm việc vì vậy loại tôi bối rối từ đó – Rick

2

Bạn sẽ cần phải gọi thuộc tính nếu đó là một chức năng, ví dụ

ret = getattr(mymodel,'objects') 
all = getattr(ret,'all') 
self.dbobject = all() 
Các vấn đề liên quan