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

Django报错无法识别'ir'字段问题咨询(附相关代码)

问题原因与解决方案

错误根源

你在Product模型中定义的ir是普通类属性,并非Django的模型字段(未继承models.Field子类):

  • 数据库中不会为该属性创建对应列,因此ORM的values()方法无法识别它,直接触发Cannot resolve keyword 'ir' into field报错。
  • 该类属性在类加载时就固定了值,所有Product实例共享同一个静态时间,无法随时间动态更新,完全不符合你“判断产品是否最近30分钟上架”的需求。

解决方案(两种可选,推荐方案二)

方案一:用模型动态属性实现

修改models.py的Product类,将ir改为@property方法,让每个实例能动态计算阈值:

from django.utils import timezone
import datetime

class Product(models.Model):
    is_on_main = models.BooleanField(default=False)
    category = models.ForeignKey(Category, on_delete = models.CASCADE)
    name = models.CharField(max_length=50)
    price = models.IntegerField()
    date = models.DateTimeField(null = True,auto_now=True)
    url = models.SlugField(max_length=100,unique=True,null=True)
    description = models.TextField(max_length=2000,default='Описание')

    def __str__(self):
        return self.name
    
    class Meta:
        ordering = ('-date',)  # 修正元组写法,避免语法歧义
    
    @property
    def ir(self):
        return timezone.now() - datetime.timedelta(minutes=30)

修改views.py,移除values()中的ir(因为它不是数据库字段),直接返回模型实例:

def index(request):
    data = (
        Product
        .objects.select_related('category')
        .filter(is_on_main=True)
    )
    categ = Category.objects.all()
    return render(request,'magazin/index.html',{'data' : data,'cat' : categ})

模板代码保持不变,直接通过实例访问ir属性:

{% for i in data %}
    <div>
       <h4><b>НАЗВАНИЕ: </b>{{i.name}}</h4>
       <h4><b>ЦЕНА: </b>{{i.price}}</h4>
       <a href="{% url 'detail' pk=i.pk %}">ПОДРОБНЕЕ</a>
       {% if i.date >= i.ir %}
            <h1 class="r">НЕДАВНО В ПРОДАЖЕ!</h1> 
       {% endif %}                                                                                                                           
       <hr>                      
    </div>
{% endfor %}

方案二:视图中计算全局阈值(更高效)

无需修改模型,在视图中仅计算一次阈值,传递给模板复用:
修改views.py:

from django.utils import timezone
import datetime

def index(request):
    # 全局计算一次阈值,所有产品共用
    ir_threshold = timezone.now() - datetime.timedelta(minutes=30)
    data = (
        Product
        .objects.select_related('category')
        .filter(is_on_main=True)
        .values('pk','name','price','date')
    )
    categ = Category.objects.all()
    return render(request,'magazin/index.html',{
        'data' : data,
        'cat' : categ,
        'ir_threshold': ir_threshold
    })

修改模板中的判断逻辑,直接使用全局阈值:

{% for i in data %}
    <div>
       <h4><b>НАЗВАНИЕ: </b>{{i.name}}</h4>
       <h4><b>ЦЕНА: </b>{{i.price}}</h4>
       <a href="{% url 'detail' pk=i.pk %}">ПОДРОБНЕЕ</a>
       {% if i.date >= ir_threshold %}
            <h1 class="r">НЕДАВНО В ПРОДАЖЕ!</h1> 
       {% endif %}                                                                                                                           
       <hr>                      
    </div>
{% endfor %}

额外注意

  • 方案二更高效,因为阈值仅计算一次,避免了每个实例重复计算时间的开销。
  • 若需在ORM查询(如filter())中使用该阈值,只能用方案二的全局变量方式,因为@property属性无法被数据库层面的查询识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:15:40