2017-09-26 20 views
1

「トップカテゴリ」と「ミドルカテゴリ」を持つアイテムのリストを持っていますが、最終的に「下部カテゴリ」がありますが現在はありません。たとえば、Electronics> Laptopとなります。外部キーを使用してDjangoファセッティングサブカテゴリ

ラップトップは、エレクトロニクスの下に表示されますので、私はこれをacheiveできる方法上の任意の考え

など、動的にこのカテゴリにファセットしたいですか?現在私は「トップカテゴリ」ファセットを正しく持っています。

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 %} 

答えて

1

あなたのモデルをこのように構造化するために少し奇妙なようです。

現在のコードでは、これを間違った方法で行っているようです。親カテゴリを参照する中間カテゴリの代わりに、トップカテゴリはその子を参照しようとします。これは、外部キーが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のようなものを使用することをお勧めします。

+0

ありがとうございます。私はモデルのデザインを読んで、それらを整理するつもりです。 ファセット加工について考えていますか? – Jack

+0

http://django-haystack.readthedocs.io/ja/v2.4.1/faceting.htmlが役立つかもしれません。 –

+0

ありがとう、私は自分のモデルを変更し、彼らはずっと良いです。まだ面倒なことはありませんが、私はドキュメントを読んできました。 – Jack

関連する問題