2011-10-26 26 views
8

ERRDjango ORM chọn Với tham gia

Models trong django:

class Key(models.Model): 
    id  = models.AutoField(primary_key=True, blank=True) 
    name = models.CharField(max_length=50) 


class Record(models.Model): 
    id   = models.AutoField(primary_key=True, blank=True) 
    project_id = models.IntegerField() 
    name  = models.CharField(max_length=50) 


class Value(models.Model): 
    id  = models.AutoField(primary_key=True, blank=True) 
    record = models.ForeignKey(Record) 
    key  = models.ForeignKey(Key) 
    value  = models.CharField(max_length=255) 

tôi cần phải chọn từ DB dữ liệu này:

NAME (from record) 
and fields related with this record 
[NAME (from key), VALUE (from value)] 
[NAME (from key), VALUE (from value)] 
[...] 

Tôi có thể sử dụng django ORM để làm cho lựa chọn này? (ví dụ trong SQL chọn giống như thế này)

SELECT 
    `keeper_record`.`id` AS `record_id`, 
    `keeper_record`.`name` AS `name`, 
    `keeper_record`.`desc` AS `desc`, 
    `keeper_key`.`name` AS `key_name`, 
    `keeper_key`.`desc` AS `key_desc`, 
    `keeper_value`.`value` AS `value_value` 
FROM `keeper_record` 
JOIN `keeper_value` ON `keeper_record`.`id` = `keeper_value`.`record_id` 
JOIN `keeper_key` ON `keeper_key`.`id` = `keeper_value`.`key_id` 
WHERE record_id = id 

Trả lời

7

Sau đây chọn các giá trị liên quan đến id bản ghi cụ thể. Sau đó, bạn có thể làm theo các khóa ngoại để có được bản ghi và khóa liên quan. Sử dụng select_related giảm thiểu tra cứu cơ sở dữ liệu.

# Select all values related to a record in your view 
record = Record.objects.get(pk=record_id) 
values = Value.objects.filter(record=record).select_related() 

# In your template 
{% for value in values %} 
{{ value.record.name }} - {{ value.key.name }} - {{ value.value }} 
{% endfor %} 

Lựa chọn hơn là một bản ghi

Trong sql của bạn, bạn có WHERE record_id = 1, vì vậy tôi cho thấy làm thế nào để có được tất cả các giá trị cho một kỷ lục đặc biệt. Bạn cũng có thể chọn các giá trị để có thêm một bản ghi trong một truy vấn.

# filter all records which belong to the project with `project_id=1` 
records = Record.objects.filter(project_id=1) 
# select all values that belong to these records 
values = Value.objects.filter(record__in=records).select_related().order_by('record') 
+0

Tôi đã hiểu đúng, rằng đối với mỗi bản ghi cần một truy vấn bổ sung để chọn giá trị, và nếu tôi muốn chọn tất cả (hoặc ít) bản ghi tôi cần chọn giá trị trong một vòng lặp? – Deadly

+2

Tôi đã cập nhật câu trả lời cho việc chọn nhiều hơn một bản ghi. Hy vọng nó giúp. – Alasdair

+0

Vâng, nó thực sự đã giúp tôi hiểu django ORM, cảm ơn. – Deadly

2

Nên tương đối đơn giản, vì bạn đã có các khóa ngoại gắn với nhau.

Record.objects.select_related().filter(id = variable_that_stores_id) 

Bạn có thể kết hợp điều đó với only để giới hạn các trường mà bạn muốn mang lại.

+0

'select_related' sẽ không hoạt động tại đây, bởi vì nó không theo phím lạ 'lùi'. – Alasdair

+0

Tôi hiểu. Có vẻ như câu hỏi đã thay đổi một chút kể từ bài đăng của tôi, nhưng bất kể câu hỏi đó không chính xác hoặc không đầy đủ. – Jordan

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