Возвращает Django-запрос элементов, которые отображаются в одной категории, когда элементы могут отображаться в нескольких категориях

Я пытаюсь вернуть запрос всех элементов в категории, где элементы могут встречаться в нескольких категориях. Соответствующие декларации моделей ниже вместе с одной из многих попыток, которые не сработали. Есть ли способ сделать это, используя встроенную промежуточную таблицу Django без необходимости явно объявлять модель для промежуточной таблицы?

class Category(models.Model): parent = models.ForeignKey('self',null=True,blank=True) name = models.CharField(max_length=150,null=True) description = models.CharField(max_length=255,null=True,blank=True) def items(self): curr_category = Category.objects.filter(pk=self.id) items_in_category = curr_category.item__categories_set.all().values('item_id') return Item.objects.filter(pk__in=items_in_category) def __unicode__(self): return self.name class Item(models.Model): name = models.TextField(null=True,blank=True) price = models.DecimalField(max_digits=10, decimal_places=2,null=True,blank=True) categories = models.ManyToManyField(Category,null=True) 

Один из способов, которым вы могли бы это сделать, – это models.Manager пользовательские models.Manager на модель вашего Item . Это идеально, ИМХО, потому что эта логика действительно не принадлежит вашей модели Category . Что делать, если вам нужны категории для вещей помимо Item ? Тогда вам придется внедрять больше методов поиска в Category , раздувая их.

 class Category(models.Model): parent = models.ForeignKey('self',null=True,blank=True) name = models.CharField(max_length=150,null=True) description = models.CharField(max_length=255,null=True,blank=True) def __unicode__(self): return self.name class ItemManager(models.Manager): def get_for_category(self, category): return self.filter(categories=category) class Item(models.Model): name = models.TextField(null=True,blank=True) price = models.DecimalField(max_digits=10, decimal_places=2,null=True,blank=True) categories = models.ManyToManyField(Category,null=True) objects = ItemManager() 

Затем назовите это, используя:

 items = Item.objects.get_for_category(category_instance) 

Если вы действительно хотите сделать это в методе Category , то почему бы и нет:

 class Category(models.Model): def items(self): # probably need to import Item model here in order to avoid # circular import reference from myapp.models import Item return Item.objects.filter(categories__id=self.id)