过滤公司基于类别

时间:2017-09-16 11:20:17

标签: python django django-models django-orm

我正在Django上做这个项目以更深入地进入它。我在模型部分有问题。有型号; CompanyProductCategoryCompany只是介绍部分。 Product是关于公司的产品及其分为ManyToManyField的类别。

我列出了页面中的所有类别,如果单击某个类别,则应筛选具有该类别产品的公司列表。但我不知道如何访问它。

这是我的模特

class Category(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50, unique=True)

class Product(models.Model):
    name = models.CharField(max_length=200, unique=True, blank=False, null=False)
    company = models.ForeignKey('Company', related_name='products', blank=True, null=True, on_delete=models.SET_NULL)
    website = models.URLField(unique=True)
    slug = models.SlugField(unique=True)
    categories = models.ManyToManyField(Category, related_name='products')


class Company(models.Model):
    name =  models.CharField(max_length=200, unique=True, blank=False, null=False)
    slug = models.SlugField(unique=True)
    description = models.CharField(max_length=400)
    editor = models.ForeignKey(User, related_name='company')
    # product = models.ForeignKey(Product, related_name='company')

1 个答案:

答案 0 :(得分:2)

您可以应用过滤器:

Company.objects.filter(products__categories__slug=category_slug)

其中category_slug是您当前选择Category.slug

的值

细节:

1)如果我们需要获得Category

cat = Category.objects.get(slug=category_slug)

2)如果我们需要获得此类别中的所有Product

 product_list = Product.objects.filter(categories=cat)

或向many2many模型字段名称添加双下划线

 product_list = Product.objects.filter(categories__slug=cat)
 #                                               ^^^^

3)如果需要获取product_list Company,请在Product Company

上的字段FK中按相关模型company = models.ForeignKey('Company', related_name='products'的related_name进行过滤
 Company.objects.filter(products__in=product_list)
 #                      ^^^^^^^

或按类别实例

 cat = Category.objects.get(slug=category_slug)
 Company.objects.filter(products__categories=cat)

或最终按类别slug值

Company.objects.filter(products__categories__slug=category_slug)