• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

通过外键的Django分面子类别

python 来源:Jack 4次浏览

我有一个“顶级类别”和“中间类别”的项目列表,最终会有一个“低级类别”,但现在不是。例如,分别为电子>笔记本电脑。通过外键的Django分面子类别

我想动态方面对这一类,所以笔记本电脑将在电子等

我如何能达致这有什么想法显示?目前,我有’热门类别’正确面对。

models.py

class mid_category(models.Model): 
    class Meta: 
     verbose_name_plural = 'Mid Categories' 
    name = models.CharField(max_length=500) 

    def __str__(self): 
     return self.name 

class top_category(models.Model): 
    class Meta: 
     verbose_name_plural = 'Top Categories' 

    name = models.CharField(max_length=500) 
    mid_cat = models.ForeignKey(mid_category, null=True) 

    def __str__(self): 
     return self.name 


# Item 
class Product(models.Model): 
    title = models.CharField(max_length=500, db_index=True) 
    price = models.DecimalField(max_digits=10, decimal_places=2) 
    retailer = models.CharField(max_length=255) 
    image = models.CharField(max_length=1000) 
    url = models.URLField(max_length=800, unique=True, default='') 
    sku = models.BigIntegerField(default=0) 
    barcode = models.BigIntegerField(default=0) 

    featured = models.CharField(max_length=255, db_index=True, choices=FEATURED_CHOICES, default='NO') 
    timestamp = models.DateTimeField(auto_now=True) 

    top_cat = models.ForeignKey(top_category) 
    mid_cat = models.ForeignKey(mid_category, null=True) 

    def __str__(self): 
     return self.title 

search_indexes.py

import datetime 
from django.utils import timezone 
from haystack import indexes 
from haystack.fields import CharField 

from decimal import Decimal 

from .models import Product, top_category 

class ProductIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(
     document=True, use_template=True, 
     template_name='/home/wilkinj33/bargainforest/bargainforestenv/motorclass/templates/search/indexes/product_text.txt' 
     ) 

    title = indexes.EdgeNgramField(model_attr='title') 
    retailer = indexes.CharField(model_attr='retailer', faceted=True) 
    price = indexes.IntegerField(model_attr='price', faceted=True) 
    barcode = indexes.CharField(model_attr='barcode') 
    topCat = indexes.CharField(model_attr='top_cat', faceted=True) 
    midCat = indexes.CharField(model_attr='mid_cat', faceted=True) 

    def get_model(self): 
     return Product 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.filter(timestamp__lte=timezone.now()) 

results.html

  <h3 class="widget-title">Shop Categories</h3> 
      <ul> 
      {% if facets.fields.topCat %} 
       {% for top_category in facets.fields.topCat %} 
       <li class="has-children"><a href="#" onclick="return onFacetChangeApplied();">{{top_category.0|cut:" "}}</a><span>(1138)</span> 
       <ul> 


       </ul> 
       </li> 
       {% endfor %} 
       {% endif %} 

===========解决方案如下:

这似乎有点不可思议来构建你的模型这种方式。

在你当前的代码中,你似乎正在做这个错误的方法。顶级类别不是引用其父类的中间类别,而是顶级类别尝试引用其子级,这是不可能的,因为外键只能指向一个对象。

如果你想做到这一点在当前的代码,你需要这样的东西更是这样的:

class TopCategory(models.Model): 
    name = ... 

class MiddleCategory(models.Model): 
    name = ... 
    parent = models.ForeignKey(TopCategory) 

更妙的是将更多的东西通用的,像这样的树结构,可以处理任何数量的水平类别:

`Product.objects.filter(category__parent=top_category) 

class Category(models.Model): 
    name = ... 
    parent = models.ForeignKey('self', null=True, blank=True) 

然后你就可以在父类像过滤器3210

,假设你有一个型号的FK到Category

更好的是,您应该使用类似django-mptt或django-treebeard的东西来提高树效率。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)