Возвращает 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)
- Мнение о Glashammer App Engine Web framework
- Оптимизация производительности для подключения данных в моделях django
- MultiValueDictKeyError / request.POST
- Обратный URL-адрес
- Django-админ. Ссылка для редактирования профиля пользователя из list_display
Один из способов, которым вы могли бы это сделать, – это 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)
- Проблема с обновлением графического интерфейса веб-страницы
- Поиск URL-адреса администратора для произвольной модели Django
- Периодическая задача не работает должным образом в django celery
- Как получить атрибут только из текущего класса, а не из возможных родительских классов?
- django settings.py os.environ.get ("X") не получает правильные значения
- Django – просмотр, странность
- Как удалить встроенный документ с помощью Mongoengine?
- Использовать языковой стандарт Python или его эквивалент в веб-приложениях?
- Что такое celery.utils.log.ProcessAwareLoggerobject, выполняющий в logging.Logger.manager.loggerDict