2010-06-16 31 views
12

Một trong những mô hình django của tôi có số lượng lớn TextField mà tôi thường không cần sử dụng. Có cách nào để nói với django "lười biếng tải" lĩnh vực này? tức là đừng bận tâm kéo nó từ cơ sở dữ liệu trừ khi tôi yêu cầu nó một cách rõ ràng. Tôi đang lãng phí rất nhiều bộ nhớ và băng thông kéo này TextField vào python mỗi khi tôi đề cập đến các đối tượng này.Django có thể tải các trường lười biếng trong một mô hình không?

Cách khác là tạo bảng mới cho nội dung của trường này, nhưng tôi muốn tránh sự phức tạp đó nếu có thể.

Trả lời

11

Chức năng xảy ra khi bạn thực hiện truy vấn, sử dụng câu lệnh defer(), thay vì trong định nghĩa mô hình. Hãy khám phá tại đây trong tài liệu: http://docs.djangoproject.com/en/dev/ref/models/querysets/#defer

Bây giờ, giải pháp thay thế của bạn về tái cấu trúc và kéo dữ liệu vào một bảng khác là một giải pháp thực sự tốt. Một số người sẽ nói rằng sự cần thiết phải tải trọng các lĩnh vực có nghĩa là có một lỗ hổng thiết kế, và các dữ liệu cần phải được mô hình khác nhau.

Dù bằng cách nào cũng hoạt động!

5

Đối với một cái gì đó như thế này bạn chỉ có thể ghi đè người quản lý mặc định. Thông thường, nó không được khuyến cáo nhưng đối với một Hoãn() nó có ý nghĩa:

class CustomManager(models.Manager): 
     def get_queryset(self): 
      return super(CustomManager, self).get_queryset().defer('YOUR_TEXTFIELD_FIELDNAME') 

    class DjangoModel(models.Model): 
     objects = CustomerManager() 
5

Có hai lựa chọn cho nạp lười biếng trong Django: https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.only

  • Hoãn (* lĩnh vực)

    Tránh tải những trường cần xử lý tốn kém để chuyển đổi chúng sang các đối tượng Python.

    Entry.objects.defer("text")

  • chỉ (* lĩnh vực)

    Chỉ tải các lĩnh vực mà bạn thực sự cần

    Person.objects.only("name")

    Cá nhân, tôi nghĩ rằng only là tốt hơn so với defer từ mã không phải là chỉ dễ hiểu hơn, nhưng cũng dễ bảo trì hơn trong thời gian dài.

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