2012-08-15 43 views

Trả lời

4

Giả sử Blabla có các trường trong câu hỏi của bạn, cũng như field4,

Blabla.objects.only('field1', 'field2', 'field3')[0].field4 

sẽ trả về giá trị của đối tượng của field4 (với một truy vấn cơ sở dữ liệu mới để lấy thông tin đó), trong khi

Blabla.objects.values('field1', 'field2', 'field3')[0].field4 

sẽ cung cấp cho

AttributeError: 'dict' object has no attribute 'field4' 

Điều này là do .values() trả về một ValuesQuerySet dựa trên QuerySet hiện có, về cơ bản là danh sách các dấu trang (theo nghĩa là QuerySet bình thường là danh sách các đối tượng Blabla).

3

.values() mang đến cho bạn "ít hơn một mô hình"; các mục mà nó trả lại gần với từ điển hơn các mô hình đầy đủ, có nghĩa là bạn không nhận được các thuộc tính mô hình nhưng bạn cũng không phải khởi tạo các mô hình đầy đủ.

.only() hạn chế danh sách trường trong SQL thành các trường cụ thể mà bạn quan tâm, nhưng vẫn khởi tạo mô hình đầy đủ; nó ngăn cản tải các trường khác cho đến khi bạn truy cập chúng (nếu có).

+4

Các mục trả về không phải là * gần * dicts, chúng [* là * dicts] (https://github.com/django/django/blob/stable/1.4.x/django/db/models/ query.py # L946) – supervacuo

1

values() trả lại số đặc biệt ValueQuerySet - khi từ điển trả về trả về từ điển đại diện cho mô hình. Nó không trả về các đối tượng mô hình.

only() là một cách để hạn chế các cột trở lại, và đảm bảo rằng chỉ các cột được trả về ngay - đó là lý do tại sao đôi khi nó được gọi là trái ngược với defer() Đó là tương đương với nói SELECT foo, bar, zoo FROM hơn bình thường SELECT [all columns] FROM. Nó sẽ trả lại một số QuerySet có thể bị xích lại.

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