2013-02-17 29 views
6

tôi có các mô hình sau:Nhiều người đến nhiều và làm thế nào để có được một queryset từ queryset

class Store(models.Model): 
    name = CharField(max_length=30) 
    product = models.ManyToManyField(Product) 

class Product(models.Model): 
    name = CharField(max_length=30) 

Làm thế nào để có được Store s với sản phẩm mang tên product_name và cũng có thể, có được tất cả các sản phẩm (trừ sản phẩm với tên product_name) ? Có thể làm cho nó trong một truy vấn? Trong SQL thô, nó sẽ đơn giản JOIN s. Bạn không chắc chắn làm thế nào để thực hiện nó thông qua Django.

Trả lời

4

Bạn sẽ có thể lọc các cửa hàng dựa trên một thuộc tính của Sản phẩm và sau đó tìm nạp trước các đối tượng đã truy xuất.

Store.objects.filter(product__name="product_name").prefetch_related('product') 

Điều này sẽ đạt đến cơ sở dữ liệu ít nhất để đạt được những gì bạn đang tìm kiếm - hai lần.

Tài liệu khác có thể được tìm thấy here.

+1

này sẽ không loại trừ các sản phẩm "PRODUCT_NAME" từ kết quả prefetch_related –

15

Bạn thực sự có thể làm những việc này với Django do đó là đánh giá queryset lười biếng. Tìm kiếm trường in của Django chấp nhận cả danh sách và queryset. Sau đây sẽ tạo ra một mã SQL lồng nhau:

stores_qs = Store.objects.filter(product__name='product_name') 
products = Product.objects.filter(store_set__in=stores_qs) 

Here là Django in tài liệu.

0

Get Cửa hàng với sản phẩm có tên là "PRODUCT_NAME":

Store.objects.filter(product__name='product_name') 

Nhận tất cả các sản phẩm ngoại trừ các sản phẩm với tên "PRODUCT_NAME":

Product.objects.exclude(name='product_name') 
Các vấn đề liên quan