Джанго - Получить предметы во множестве - PullRequest
2 голосов
/ 23 августа 2010

Мои модели:

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)

Набор включает в себя много предметов, и предмет может быть во многих наборах. Итак, как получить список предметов, когда мы знаем идентификатор предмета в некоторых наборах, кроме самого себя? Пожалуйста, дайте мне несколько кодов. Большое спасибо!

Пример: У нас есть два набора, как это: (1,2,3,4) и (2,3,5,7,9), id = 3, то результат = (1,2,4,5,7,9). Примечание: результат не включает 3.

Ответы [ 2 ]

3 голосов
/ 23 августа 2010

Получить все 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()

Для получения дополнительной информации - прочитайте документы .

1 голос
/ 23 августа 2010

Если я правильно понимаю ваш вопрос, вам нужен отдельный набор всех элементов из всех 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)
...
...