1

私は2つのテーブルを持っています:

  • 商品(ID、名前)
  • 属性 (id、product_id、名前、値)

商品を検索する際、テーブル「属性」を2回結合するにはどうすればよいですか? 後でページングされるため、それらは 1 つのクエリに含まれている必要があります。

例: 2 つの属性が必要な商品を検索します。1 つは 用name=att1, value=value1、もう 1 つは 用name=att2, value=value2です。


ソースコード:

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, null=False)

class Attribute(models.Model):
    attribute_id = models.AutoField(primary_key=True)
    product = models.ForeignKey(Product, null=False)
    name = models.CharField(max_length=100, null=False)
    value = models.CharField(max_length=100, null=False)

機能しないクエリ:

Product.objects.select_related().filter('attribute__name': 'n1', 'attribute__value':'v1').filter('attribute__name': 'n2', 'attribute__value':'v2')
4

2 に答える 2

1

2回参加する必要はありません。ForignKey を使用してモデルを作成し、関連属性のセットを取得できます

例えば ​​:

このようなモデルを作成します

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

class Attribute(models.Model):
    product = models.ForeignKey(Product)
    name = models.CharField(max_length=100)
    value = models.IntegerField()

電話で商品を受け取ることができます

item = Product.objects.get(id=xxx)

次に、このアイテムに関連する属性のすべてのリストを取得します

from django.db.models import Q

attr = item.attribute_set.filter(Q(name='name1') | Q(name='name2'))
于 2012-11-18T08:18:53.047 に答える
0

次のようなものを使用します。

p = Product.objects.get(pk=1)
filtered = p.attribute_set.filter(name__in=['n1','n2'],value__in=['v1','v2'])
于 2012-11-18T08:49:18.267 に答える