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
相关产品推荐
相关产品推荐

