私は次のモデルを持っています:
class Product(models.Model):
name = CharField(max_length=30)
class Store(models.Model):
name = CharField(max_length=30)
product = models.ManyToManyField(Product)
product_name
という名前の製品でStore
sを取得する方法と、すべての製品(product_name
という名前の製品を除く)を取得する方法は? 1つのクエリでそれを行うことは可能ですか?生のSQLでは、単純なJOIN
sになります。 Djangoを介して実装する方法がわかりません。
クエリセットの評価が遅いため、実際にはDjangoでこれらのことを実行できます。Djangoのin
フィールドルックアップは、リストとクエリセットの両方を受け入れます。次に、ネストされたSQLコードを作成します。
products = Product.objects.filter(store_set__in=stores_qs)
stores_qs = Store.objects.filter(product__name='product_name')
ここ はDjango in
ドキュメントです。
Productの属性に基づいてストアをフィルタリングしてから、取得したオブジェクトのprefetch_relatedをフィルタリングできるはずです。
Store.objects.filter(product__name="product_name").prefetch_related('product')
これにより、データベースにアクセスする回数が最も少なくなり、探しているものが2回達成されます。
詳細なドキュメントは ここ にあります。
「product_name」という名前の商品でストアを取得します。
Store.objects.filter(product__name='product_name')
「product_name」という名前の製品を除くすべての製品を取得します。
Product.objects.exclude(name='product_name')