Django查询:加入一个表2次

时间:2012-11-18 08:05:50

标签: django django-models django-queryset

我有两张桌子:

  • 产品(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')

2 个答案:

答案 0 :(得分: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'))

答案 1 :(得分:0)

使用类似的东西:

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