Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当项目可以出现在多个类别中时,返回单个类别中出现的项目的Django queryset_Python_Django_Django Models_Django Orm - Fatal编程技术网

Python 当项目可以出现在多个类别中时,返回单个类别中出现的项目的Django queryset

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)

我试图返回一个类别中所有项目的查询集,其中项目可以出现在多个类别中。下面是相关的模型声明以及许多不起作用的尝试之一。有没有一种方法可以使用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
。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)

非常感谢。我使用了你的第二个建议,因为我只需要获得一个类别中的项目数。甚至不需要导入项目模型。