【问题标题】:django subcategory slug filterdjango 子类别段塞过滤器
【发布时间】:2016-05-01 22:07:13
【问题描述】:

深入了解 Django 并跟随 Django 探戈书,但最后一期在添加子类别后让我了解,这些子类别未包含在该教程中。

我有以下几点:

models.py
class Category(models.Model):
"""Category"""
name = models.CharField(max_length=50)
slug = models.SlugField()


def save(self, *args, **kwargs):

                    #self.slug = slugify(self.name)
            self.slug = slugify(self.name)
            super(Category, self).save(*args, **kwargs)
def __unicode__(self):
    return self.name


class SubCategory(models.Model):
"""Sub Category"""
category = models.ForeignKey(Category)
name = models.CharField(max_length=50)
slug = models.SlugField()

def save(self, *args, **kwargs):

            self.slug = slugify(self.name)
            super(SubCategory, self).save(*args, **kwargs)

def __unicode__(self):
    return self.name

urls.py
(r'^links/$', 'rango.views.links'),
(r'^links/(?P<category_name_slug>[\w\-]+)/$', 'rango.views.category'),  
(r'^links/(?P<category_name_slug>[\w\-]+)/(?P<subcategory_name_slug>[\w\-]+)/$', 'rango.views.subcategory'),  

views.py
@require_GET
def links(request):
"""Linkdirectory Page"""
category_list = Category.objects.order_by('name')
context_dict = {'categories': category_list}
return render(request, 'links.html', context_dict)

@require_GET
def category(request, category_name_slug):
"""Category Page"""
category = Category.objects.get(slug=category_name_slug)
subcategory_list = SubCategory.objects.filter(category=category)
context_dict = {'subcategories': subcategory_list}
return render(request, 'category.html', context_dict)

@require_GET
def subcategory(request, subcategory_name_slug, category_name_slug):
"""SubCategory Page"""
context_dict = {}
try:
    subcategory = SubCategory.objects.get(slug=subcategory_name_slug)
    context_dict['subcategory_name'] = subcategory.name
    websites = Website.objects.filter(sub_categories=subcategory)
    context_dict['websites'] = websites
    context_dict['subcategory'] = subcategory
except SubCategory.DoesNotExist:
return render(request, 'subcategory.html', context_dict)

这一切都很好,直到我添加具有相同名称的子类别,例如多个类别的子类别“其他”。

我明白为什么,当我到达“def subcategory”时,我的 slug 会返回多个子类别,所以我需要以某种方式将它们限制为相关类别,比如

"SELECT 
subcategory = SubCategory.objects.get(slug=subcategory_name_slug)
WHERE 
subcategory = SubCategory.objects.filter(category=subcategory)
CLAUSE" 

什么的;)

不知道什么是最好的解决方法以及如何过滤这些

【问题讨论】:

    标签: python django categories slug


    【解决方案1】:

    鉴于对于两个不同的 Category 对象,您可能有两个具有相同名称的不同 SubCategory 对象,因此您可以按照您的建议添加 Category 作为附加过滤器。

    同时按 SubCategory.slug 和 Category.slug 过滤

    为了实现这一点,我看到您有一个视图,它对 SubCategoryCategory 都采用了 slug,您像这样定义 subcategory(request, subcategory_name_slug, category_name_slug)。这些足以过滤:

    subcategory = SubCategory.objects.get(
        slug=subcategory_name_slug,
        category__slug=category_name_slug
    )
               ^
               |__ # This "double" underscore category__slug is a way to filter
                   # a related object (SubCategory.category)
                   # So effectively it's like filtering for SubCategory objects where
                   # SubCategory.category.slug is category_name_slug
    

    如上所示,我使用 SubCateogry.objects.get(...) 来获取单个对象,而不是可以返回许多对象的 `SubCategory.objects.filter(...)。

    对每个类别的 SubCategory.name 实施 unicity

    要使用get() 安全地执行此操作,需要保证对于任何给定类别,不会有超过一个具有相同名称的子类别

    您可以使用unique_together 强制执行此条件

    class SubCategory(models.Model):
        class Meta:
            unique_together = (
                ('category', 'name'),          # since slug is based on name,
                                               # we are sure slug will be unique too
            )
    

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      相关资源
      最近更新 更多