14

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

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

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

Storeという名前の製品で s をproduct_name取得し、すべての製品 ( name の製品を除く)を取得するにはどうすればよいproduct_nameですか? 1つのクエリで作成することは可能ですか? 生の SQL では、単純なJOINs になります。Django経由で実装する方法がわかりません。

4

3 に答える 3

22

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

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

ここにDjangoのinドキュメントがあります。

于 2013-02-17T01:59:15.493 に答える
7

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

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

これは、探しているものを達成するためにデータベースにヒットする回数が最も少なく、2 回です。

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

于 2013-02-17T01:33:28.450 に答える
1

「product_name」という名前の製品を含む店舗を取得します。

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

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

Product.objects.exclude(name='product_name')
于 2013-02-17T02:04:02.927 に答える