2012-05-22 30 views
25

Tôi đã có một sniff xung quanh SO và không thể tìm thấy điều này, nhưng tôi chắc chắn nó là ở đâu đó. Xin lỗi vì bài đăng tiềm năng này!Django - làm cách nào để chọn một cột cụ thể từ mô hình?

Nếu tôi có mã này:

return Story.objects.filter(user=request.user.id).order_by('-create_date') 

và nói câu chuyện có, um, một lĩnh vực "mô tả", và tôi chỉ muốn điều đó lĩnh vực mô tả, không có nhu cầu sử dụng db để gửi bất cứ thứ gì trở lại với kết quả của tôi, làm cách nào để giới hạn truy vấn thành chỉ?

Đó là, làm thế nào để tôi tạo ra SQL này:

select description from story where user_id = x order by create_date desc 

(trong đó x là giá trị request.user.id, tất nhiên)

+0

trùng lặp có thể xảy ra của [Làm thế nào để hạn chế các cột được trả về bởi Django truy vấn?] (Http://stackoverflow.com/questions/2448978/how-to-limit-columns-returned-by-django-query) –

Trả lời

37

Sử dụng values() hoặc values_list().

Nếu bạn sử dụng values(), Bạn sẽ kết thúc với một danh sách các từ điển (về mặt kỹ thuật một ValuesQuerySet)

instance = MyModel.objects.values('description')[0] 
description = instance['description'] 

Nếu bạn sử dụng values_list(), bạn sẽ kết thúc với một danh sách các hàng

instance = MyModel.objects.values_list('description')[0] 
description = instance[0] 

Hoặc nếu bạn chỉ nhận được một giá trị như trong trường hợp này, bạn có thể sử dụng số flat=True kwarg với values_list để nhận danh sách giá trị đơn giản

description = MyModel.objects.values_list('description', flat=True)[0] 
+5

Đúng: 'return Story.objects.filter (user = request.user.id) .order_by ('- create_date') .giá trị ('description')' – Furbeenator

+3

@bharal rất nhiều lần tôi tìm thấy một danh sách các giá trị là có ích hơn một danh sách các bộ dữ liệu. Bạn có thể chuyển 'flat = True' thành' values_list' để lấy danh sách các giá trị – dm03514

+0

cảm ơn tất cả, đây chính là thứ tôi cần – bharal

3

Sử dụng only method. Vui lòng đọc tài liệu

+0

Điều này thực sự gửi lại 'pk' cũng như – okm

+1

um, từ tài liệu tôi vừa đọc:() phương pháp (và người anh em họ của nó, chỉ(), dưới đây) chỉ dành cho các trường hợp sử dụng nâng cao. Chúng cung cấp tối ưu hóa khi bạn đã phân tích các truy vấn của bạn chặt chẽ và hiểu chính xác thông tin bạn cần và đã đo lường sự khác biệt giữa việc trả về các trường bạn cần và toàn bộ trường cho mô hình sẽ là quan trọng. – bharal

1

Khi tài liệu cho biết nếu tập hợp truy vấn của bạn sẽ chỉ mang lại một đối tượng, bạn nên sử dụng get() thay cho bộ lọc. Từ tên mà bạn đã đưa ra, tôi giả sử rằng user_id là khác biệt đối với mọi người dùng. EDIT1: Tôi vừa nhận được thông báo về mệnh đề orderby. Vì vậy, tôi sẽ đề nghị sử dụng mã này nếu user_id là khác biệt hoặc với pk.

description = story.objects.filter('description').get(user_id=x) 
Các vấn đề liên quan