2013-03-19 53 views
17

Tôi đang gặp khó khăn trong việc tìm kiếm đúng truy vấn cho dự án của mình. Dưới đây là một ví dụ hoặc mô hình của tôi:Truy vấn Bộ lọc Django Phím nước ngoài

from django.db import models 

class Publisher(models.Model): 
    name = models.CharField(max_length=30) 
    address = models.CharField(max_length=50) 
    city = models.CharField(max_length=60) 
    state_province = models.CharField(max_length=30) 
    country = models.CharField(max_length=50) 
    website = models.URLField() 

    def __unicode__(self): 
     return self.name 

class Author(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=40) 
    email = models.EmailField() 

    def __unicode__(self): 
     return u'%s %s' % (self.first_name, self.last_name) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author) 
    publisher = models.ForeignKey(Publisher) 
    publication_date = models.DateField() 

    def __unicode__(self): 
     return self.title 

làm thế nào để tôi nhận được nhà xuất bản từ lớp cuốn sách ví dụ tôi muốn để có được tất cả các nhà xuất bản cho tất cả các cuốn sách có tựa đề bắt đầu bằng 'xin chào'? Cảm ơn bạn

Trả lời

28

Nếu bạn muốn xuất bản Nhà xuất bản, bạn phải bắt đầu với Publisher. Điều đó có nghĩa là bạn phải truy vấn thông qua quan hệ nhà xuất bản Book → về phía sau. Đây là những gì các tài liệu nói về nó:

Lookups that span relationships

Để trải rộng trên một mối quan hệ, chỉ cần sử dụng tên trường của lĩnh vực liên quan qua các mô hình, cách nhau bằng dấu gạch dưới đôi, cho đến khi bạn nhận được để lĩnh vực mà bạn muốn

...

Để tham khảo mối quan hệ "đảo ngược", chỉ cần sử dụng tên chữ thường của mô hình.

Truy vấn:

Publisher.objects.filter(book__title__startswith='hello') 
+1

nó làm việc ^^ Cảm ơn rất nhiều bạn đã lưu thời hạn của tôi ^^ –

+0

gì nếu tôi muốn xem tất cả sách được xuất bản bởi một số nhà xuất bản? –

+1

@ArindamRoychowdhury: 'Book.objects.filter (publisher__name = 'Some')' –

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