You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何按条件查询外键并给premium付费资源添加专属标识

实现方案说明

这里提供两种可行实现思路,优先推荐第一种方案,灵活度更高,后台配置更方便。


方案1:给包分类加付费标识字段(推荐)

方案优势

不需要硬编码属性,后续要修改某个分类的付费/免费属性,直接在Django后台操作即可,不需要改动代码。

修改步骤

  1. 修改models.py中的Package_Category模型,新增布尔类型的付费标识字段
    class Package_Category(models.Model):
        title = models.CharField(max_length=10000, verbose_name="Title")
        slug = models.SlugField(max_length=1000, unique=True)
        # 新增字段,默认分类为免费包
        is_premium = models.BooleanField(default=False, verbose_name="是否为付费包")
    
        def get_absolute_url(self):
            return reverse("package-categories", args=[self.slug])
        
        def __str__(self):
            return self.title
            
        class Meta:
            verbose_name = "Package Category"
            verbose_name_plural = "Package Categories"
    
    修改完成后执行python manage.py makemigrations和python manage.py migrate生成数据库迁移,之后去后台把需要标记为付费的分类的is_premium勾选上即可。
  2. 修复index.html模板的判断逻辑
    原模板直接调用package_category.premium是错误的,没有单独传入该变量,需要从vector的关联属性获取:
    <div class="_io980 item_image_urip">
        {% if vector.package_category.is_premium %}
            <!-- 可替换为你需要的星标样式,不需要展示免费标识可以删掉else分支 -->
            <span class="premium-tag">⭐ Premium 付费包</span>
        {% endif %}
        <h4 class="_95lp"><a href="#" class="_50gt">{{vector.package_category}}</a></h4>
        <span class="_ip76n">{{vector.category}}</span>
    </div>
    
  3. 若需要单独筛选所有付费包,修改views.py的查询逻辑即可:
    def index(request):
        # 加过滤条件只查询付费包
        vectors = Vectors.objects.filter(status='published', package_category__is_premium=True).order_by('-created')
        context = {
            'vectors': vectors,
        }
        return render(request, 'index.html', context)
    

方案2:使用元组CHOICE实现

如果后续可能扩展多个付费等级(比如限时免费、SVIP专属等),可以用该方案:

  1. 修改models.py,新增类型选项并更新模型
    PACKAGE_TYPE_CHOICE = (
        ('free', '免费包'),
        ('premium', '付费包'),
    )
    
    class Package_Category(models.Model):
        title = models.CharField(max_length=10000, verbose_name="Title")
        slug = models.SlugField(max_length=1000, unique=True)
        package_type = models.CharField(choices=PACKAGE_TYPE_CHOICE, default='free', max_length=20, verbose_name="包类型")
        # 其余代码不变
    
  2. 模板判断逻辑对应修改为:
    {% if vector.package_category.package_type == 'premium' %}
        <span class="premium-tag">⭐ Premium 付费包</span>
    {% endif %}
    
    需要筛选付费包时,视图过滤条件改为package_category__package_type='premium'即可。

内容的提问来源于stack exchange,提问作者Destiny Franks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:15:07