Python 当项目可以出现在多个类别中时,返回单个类别中出现的项目的Django queryset
我试图返回一个类别中所有项目的查询集,其中项目可以出现在多个类别中。下面是相关的模型声明以及许多不起作用的尝试之一。有没有一种方法可以使用Django内置的中间表功能做到这一点,而不必显式声明中间表的模型Python 当项目可以出现在多个类别中时,返回单个类别中出现的项目的Django queryset,python,django,django-models,django-orm,Python,Django,Django Models,Django Orm,我试图返回一个类别中所有项目的查询集,其中项目可以出现在多个类别中。下面是相关的模型声明以及许多不起作用的尝试之一。有没有一种方法可以使用Django内置的中间表功能做到这一点,而不必显式声明中间表的模型 class Category(models.Model): parent = models.ForeignKey('self',null=True,blank=True) name = models.CharField(max_length=150,null=True)
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
。IMHO,这是理想的,因为这种逻辑实际上不属于您的类别
模型。除了项目
之外,如果您还需要物品的类别,该怎么办?然后,您必须在类别
上实现更多检索方法,使其膨胀
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)
如果您真的想在类别中使用方法,那么为什么不:
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)
非常感谢。我使用了你的第二个建议,因为我只需要获得一个类别中的项目数。甚至不需要导入项目模型。