Django通过外键修改子类别

时间:2017-09-26 13:29:25

标签: python django django-models

我有一个列有“顶级类别”的项目列表。和一个中间类别,最终会有一个较低的类别'但现在不行。例如电子产品>笔记本电脑,分别。

我想在这些类别上动态调整,因此笔记本电脑将在电子产品等下显示。

关于如何实现这一点的任何想法?现在我有顶级类别'正确分面。

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 个答案:

答案 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-mpttdjango-treebeard之类的内容来提高树的效率。