2012-11-18 26 views
1

我有2个表:Django的查询:加入牌桌2次

  • 产品(ID,姓名)
  • 属性(ID,PRODUCT_ID,名称,值)

哪有搜索产品时,我会加入2次“属性”表格?由于稍后分页,它们必须在一个查询中。

举例:搜索必须具有2个属性的产品 - 一个用于name=att1, value=value1,另一个用于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') 
+1

发表您的型号代码。 –

+0

@BurhanKhalid:刚更新了代码。 – LTC

回答

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')) 
+0

我需要筛选必须具有属性的产品(“name = att1,value = value1”和“name = att2,value = value2”)。在你的回答中,所有产品都会被退回。 – LTC

+0

有Q对象允许进行复杂的查找。我将编辑答案以仅查询name1和name2属性 –

0

使用这样的事情:

p = Product.objects.get(pk=1) 
filtered = p.attribute_set.filter(name__in=['n1','n2'],value__in=['v1','v2'])