2010-03-27 29 views
10

Trong mô hình sau:Django Ngoại truy vấn chính

class header(models.Model): 
    title = models.CharField(max_length = 255) 
    created_by = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return self.id() 

class criteria(models.Model): 
    details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

class options(models.Model): 
    opt_details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

Nếu có một hàng trong cơ sở dữ liệu cho tiêu đề bảng như Id=1, title=value-mart , createdby=CEO

Làm thế nào để truy vấn tiêu chuẩn và bảng tùy chọn để có được tất cả các giá trị có liên quan đến bảng tiêu đề id = 1

Cũng có thể một số đề xuất một liên kết tốt cho ví dụ truy vấn.

Trả lời

9

Trước hết, không sử dụng id trong tên, vì nó gây nhầm lẫn. Trường đó không phải là ID, chính nó là đối tượng. (Nếu bạn có một trường ref nó tự động tạo ra một lĩnh vực ref_id)

options.objects.filter(header=a_header) 

Bạn truy vấn nó giống như bất kỳ giá trị, nơi mà một số ví dụ tiêu đề là giá trị mà bạn đang lọc theo.

3

Tôi khuyên bạn nên thử chúng tôi coding style và quy ước đặt tên giống như bạn thấy trong tài liệu Django cho số Models. Một cái gì đó như thế này:

class Header(models.Model): 
    ... 

class Criteria(models.Model): 
    details = model.CharField(max_length=255) 
    header = models.ForeignKey(Header) 

Và sau đó truy vấn chúng khi cần thiết:

# find Criteria for a given header 
value_mart = Header.objects.get(id=1) 

# ... via an instance of Header. 
value_mart.criteria_set.all() 

# ... or with a filter(). 
Criteria.objects.filter(header=value_mart) 
Criteria.objects.filter(header_id=1) 

Các tài liệu cho many-to-one relationships cũng tham khảo một usage example.

20

Ironfroggy là đúng, nhưng có một cách rõ ràng hơn để có được các đối tượng optionscriteria có liên quan. Django tự động tạo ra một 'mối quan hệ ngược' cho mỗi khóa ngoại chỉ vào một mô hình, và đó thường là tên của mô hình liên quan cộng với _set. Vì vậy:

mycriteria.options_set.all() 
mycriteria.header_set.all() 

sẽ cung cấp cho bạn tất cả các optionsheader đối tượng liên quan đến một đối tượng criteriamycriteria.

Ngoài ra, ghi chú về kiểu: như ironfroggy được chỉ ra, bạn không nên sử dụng id trong trường khóa ngoài, nhưng bạn cũng nên sử dụng kiểu viết hoa cho các lớp mô hình của mình, để bạn có thể thấy sự khác biệt giữa lớp Criteria và một ví dụ cụ thể criteria.

Về mặt liên kết, Django documentation tuyệt vời và giải thích tất cả điều này.

5

Có vẻ như bạn đang tìm kiếm Following relationships "backward".

Bạn có thể nhận các đối tượng tiêu đề bạn muốn lọc theo, và sử dụng một cái gì đó giống như

obj = Header.objects.get(title="value-mart", "createdby=CEO") 
obj.criteria_set.all() 

Nhìn vào documentation để biết chi tiết hơn

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