Django - 获取多套物品

时间:2010-08-23 12:03:14

标签: django django-models django-templates django-queryset

我的模特:

class ItemSet(models.Model):
    name = models.CharField(max_length=30)
    item = models.ManyToManyField(Item)
    order = models.IntegerField(default=0)

class Item(models.Model):
    name = models.CharField(max_length=30)
    desc = models.CharField(max_length=100)

一个集合包含许多项目,一个项目可以在多个集合中。 那么,当我们知道某些集合中的项目的ID但是本身时,如何获取项目列表? 请给我一些代码。非常感谢你!

示例: 我们有两套这样的: (1,2,3,4)和(2,3,5,7,9), id = 3然后结果=(1,2,4,5,7,9)。注意:结果不包括3。

2 个答案:

答案 0 :(得分:3)

获取特定Item中的所有ItemSet

set = ItemSet.objects.get(id=99)
items = set.item.all()

获取包含特定ItemSet的所有Item

item = Item.objects.get(id=88)
sets = item.itemset_set.all()

有关详细信息,请read docs

答案 1 :(得分:1)

如果我正确理解了您的问题,您需要包含特定ItemSets排除的所有Item的所有项目的不同集合返回集合中的Item本身。听起来不错吗?

修改:经过测试。

class ItemSet(models.Model):
    name = models.CharField(max_length=30)
    items = models.ManyToManyField('Item', related_name='item_sets')
    order = models.IntegerField(default=0)

class Item(models.Model):
    name = models.CharField(max_length=30)
    desc = models.CharField(max_length=100)

# First, get all sets containing the item we're interested in:
item_sets = ItemSet.objects.filter(items__pk=item.pk)
# Next, get all items belonging to those sets, excluding the item we're interested in:
items = Item.objects.filter(item_sets__pk__in=item_sets).exclude(pk=item.pk).distinct()

注意:这实际上执行单个查询(使用Django 1.2.1),但这可能取决于您的数据库后端。您可以像这样检查生成的SQL:

>>> from django.db import connection
>>> items._as_sql(connection)
...