gpt4 book ai didi

python - Django 通过外键分面子类别

转载 作者:太空宇宙 更新时间:2023-11-03 14:43:28 24 4
gpt4 key购买 nike

我有一个包含“顶级类别”和“中间类别”的项目列表,最终会有一个“较低类别”,但现在还没有。例如分别是电子>笔记本电脑

我想动态地划分此类别,因此笔记本电脑将显示在电子产品等下方。

关于如何实现这一目标有什么想法吗?目前我的“顶级类别”分面正确。

模型.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

搜索索引.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())

结果.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)

更好的是更通用的东西,比如这个树结构,它可以处理任意数量的类别级别:

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让你的树更加高效。

关于python - Django 通过外键分面子类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46427909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com