【问题标题】:Django - Get items in many setsDjango - 获取多组物品
【发布时间】:2011-04-02 14:46:52
【问题描述】:

我的模型:

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。

【问题讨论】:

  • how to get a list of items when we know the id of a item in some sets but itself: 你能改写这句话并补充一个例子吗?
  • 对不起,我已经按照你的意愿添加了考试

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


【解决方案1】:

获取特定ItemSet中的所有Items:

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

获取包含特定Item的所有ItemSets:

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

更多信息 - readdocs

【讨论】:

  • 只是因为我有大量的物品。我想选择一种最佳的查询方式。谢谢!
  • 从传统方式开始。根据需要进行优化。永远不要过早。
【解决方案2】:

如果我正确理解了您的问题,您需要一个 distinct 集合来自所有 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)
...

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多