2010-03-11 38 views
7

Tôi có hai bảng, một "Công ty" và một "nhân viên":Làm cách nào để chọn từ nhiều bảng trong một truy vấn bằng Django?

class Company(models.Model): 
    name = models.CharField(max_length=60) 

class Employee(models.Model): 
    name = models.CharField(max_length=60) 
    company = models.ForeignField(Company) 

Và tôi muốn liệt kê mọi nhân viên trong một bảng, với Công ty bên cạnh nó. Đó là đủ đơn giản bằng cách gọi employees = Employee.objects.all() và trong vòng lặp mẫu máng nó và gọi {{employee.company.name}}.

Vấn đề với giải pháp này là nó sẽ được tạo truy vấn mới cho từng mục trong vòng lặp. Vì vậy, đối với mỗi người lao động sẽ có một truy vấn cho Công ty tìm kiếm một cái gì đó như thế này:

SELECT `company`.`id`, `company`.`name` 
FROM `company` 
WHERE `company`.`id` = 1 # This will of course be the employee.company_id 

Thay vào đó tôi muốn thực hiện này tham gia ban đầu ở cùng một truy vấn nhận được nhân viên. Một cái gì đó như thế này:

SELECT `employee`.`name` AS `name`, 
     `company`.`name` AS `company_name` 
FROM `employee` INNER JOIN `company` ON `employee`.`company_id` = `company`.`id` 

Điều này có thể thực hiện với Bộ truy vấn Django không? Nếu không, có cách nào tôi có thể làm việc xung quanh để giải quyết này (không có sql nguyên)? Hoặc hành vi này có nên được bỏ qua, được lưu trong bộ nhớ cache và được xem là "tối ưu hóa" không?

Trả lời

22

Sử dụng select_related() sẽ điền trước các thuộc tính thích hợp:

Employee.objects.select_related() 
+0

Tôi đã đọc tài liệu lên xuống, nhưng đã hoàn toàn bỏ lỡ phần này. Vâng cảm ơn rất nhiều! Điều đó thật đáng xấu hổ. – tdolsen

7

Tôi đoán những gì bạn đang tìm kiếm là phương pháp select_related của queryset của bạn. Xem the doc

select_related()

Trả về một QuerySet rằng sẽ tự động "làm theo" foreign-key mối quan hệ, chọn mà thêm liên quan đối tượng dữ liệu khi nó thực hiện truy vấn của nó. Đây là một tăng cường hiệu suất mà kết quả trong (đôi khi nhiều) truy vấn lớn hơn nhưng nghĩa sử dụng sau này của các mối quan hệ ngoại-key sẽ không yêu cầu cơ sở dữ liệu truy vấn

0

Đó là một câu hỏi cũ, hãy để tôi cung cấp một câu trả lời mới.

Trên thực tế, bạn có thể làm điều này:

employees = Employee.objects.all().values('id','name','company__name') 

sau đó, Django sẽ tự động tra cứu lớp Công ty và tìm ra tên công ty cho bạn.

trên trang mẫu, sử dụng {{employee.company__name}} sau đó nó sẽ hiển thị tên công ty chính xác.

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