我有一个列有“顶级类别”的项目列表。和一个中间类别,最终会有一个较低的类别'但现在不行。例如电子产品>笔记本电脑,分别。
我想在这些类别上动态调整,因此笔记本电脑将在电子产品等下显示。
关于如何实现这一点的任何想法?现在我有顶级类别'正确分面。
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 %}
答案 0 :(得分:1)
以这种方式构建模型似乎有点奇怪。
在您当前的代码中,您似乎正在以错误的方式执行此操作。顶级类别不是引用其父级的中间类别,而是尝试引用其子级,这是不可能的,因为外键只能指向一个对象。
如果您想在当前代码中执行此操作,则需要更多类似的内容:
class TopCategory(models.Model):
name = ...
class MiddleCategory(models.Model):
name = ...
parent = models.ForeignKey(TopCategory)
更好的是,这种树结构更通用,可以处理任意数量的类别:
class Category(models.Model):
name = ...
parent = models.ForeignKey('self', null=True, blank=True)
然后,您可以过滤父类别,例如:
`Product.objects.filter(category__parent=top_category)
假设您的Product
模型的FK为Category
。
更好的是,您应该使用django-mptt或django-treebeard之类的内容来提高树的效率。