web-dev-qa-db-ja.com

多対多およびクエリセットからクエリセットを取得する方法

私は次のモデルを持っています:

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

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

product_nameという名前の製品でStoresを取得する方法と、すべての製品(product_nameという名前の製品を除く)を取得する方法は? 1つのクエリでそれを行うことは可能ですか?生のSQLでは、単純なJOINsになります。 Djangoを介して実装する方法がわかりません。

12
sunprophit

クエリセットの評価が遅いため、実際にはDjangoでこれらのことを実行できます。Djangoのinフィールドルックアップは、リストとクエリセットの両方を受け入れます。次に、ネストされたSQLコードを作成します。

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

ここ はDjango inドキュメントです。

21
miki725

Productの属性に基づいてストアをフィルタリングしてから、取得したオブジェクトのprefetch_relatedをフィルタリングできるはずです。

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

これにより、データベースにアクセスする回数が最も少なくなり、探しているものが2回達成されます。

詳細なドキュメントは ここ にあります。

6
jondykeman

「product_name」という名前の商品でストアを取得します。

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

「product_name」という名前の製品を除くすべての製品を取得します。

Product.objects.exclude(name='product_name')
1
UnLiMiTeD