如何从Django数据库中获取Product模型的特定dataset_id值?
解决Django中访问模型类字段而非实例值导致的DeferredAttribute问题
你遇到的问题核心是直接访问了模型类的字段定义,而不是具体商品实例的字段值,所以才会打印出DeferredAttribute对象,而不是预期的31。
问题原因
Product.dataset_id是在访问Product这个模型类的字段属性,它只是Django用来描述字段的元数据对象(DeferredAttribute负责字段的延迟加载逻辑),并不是某个具体商品记录里存储的实际数值。你需要先获取到选中的Pizza对应的Product实例,再访问这个实例的dataset_id属性才能拿到正确的数值。
解决方案
修改你的views.py代码,先获取目标商品的实例,再提取dataset_id:
from .models import Product def cart(request): if request.user.is_authenticated: try: # 获取名为Pizza的Product实例 selected_product = Product.objects.get(food_name="Pizza") # 从实例中获取实际的dataset_id值 target_dataset_id = selected_product.dataset_id print(target_dataset_id) # 现在会输出预期的31 # 将正确的id传入recommend函数 res = recommend(item_id=target_dataset_id, num=3) except Product.DoesNotExist: # 处理找不到Pizza商品的情况,避免程序崩溃 res = [] print("未找到名为Pizza的商品记录") customer = request.user.customer order, created = Order.objects.get_or_create(customer=customer, complete=False) items = order.orderitem_set.all() cartItems = order.get_cart_items print(res)
额外提示
- 如果是前端用户动态选择的商品(不是固定的Pizza),你需要从请求中获取标识商品的参数(比如
request.GET.get('food_id')或者request.POST.get('food_name')),再用这个参数去查询对应的Product实例,而不是硬编码food_name="Pizza"。 - 一定要加上
try-except捕获Product.DoesNotExist异常,防止因为数据库中没有对应商品记录导致程序抛出错误。
内容的提问来源于stack exchange,提问作者Radon333
相关产品推荐
相关产品推荐

