2010-08-23 1 views
2

Мои модели:Джанго - Получить продукты во многих наборах

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.

+0

'как получить список элементов, когда мы знаем идентификатор элемента в некоторых наборах, кроме самого себя': можете ли вы перефразировать это предложение и добавить пример? –

+0

извините, я добавил экзамен по вашему желанию – anhtran

ответ

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) 
... 
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.

+0

Просто потому, что у меня есть большое количество предметов. Я хочу выбрать лучший способ для запросов. Благодаря! – anhtran

+0

Начать традиционный путь. Оптимизируйте по мере необходимости. Никогда преждевременно. –

 Смежные вопросы

  • Нет связанных вопросов^_^