Django外键问题导致无法向watchlist表插入数据求助
问题分析与解决
1. 核心错误:函数与模型重名导致'function' object has no attribute 'objects'
你的视图函数名和模型类名都是watchlist,在视图内部调用watchlist.objects时,Python会优先识别为当前视图函数,而非models里的watchlist模型,直接引发该错误。
解决:
修改视图函数名,比如改成add_to_watchlist:
@login_required(login_url='login') def add_to_watchlist(request): # 后续代码保持逻辑不变,仅函数名修改
2. User外键赋值错误
User.objects.filter(id=request.user)是错误写法:request.user已经是登录的User实例,不需要再去查询;且filter()返回的是QuerySet集合,而外键字段需要单个模型实例。- 直接用
request.user即可赋值给外键。
修正代码:
# 替换原user查询代码 user = request.user
3. 其他潜在问题
(1) Stock模型未导入
models.py里的stock外键未导入,views.py里也没导入stock模型,会引发未定义错误。
- 在models.py顶部导入
stock模型(假设stock在当前app的models里):
from .models import stock # 或者根据实际路径导入
- 在views.py里导入:
from .models import watchlist, stock
(2) __str__方法返回非字符串类型
__str__方法要求返回字符串,但你返回的是DateTimeField实例,会引发类型错误,修改为:
def __str__(self): return str(self.stock_add_time)
(3) AutoField无需指定max_length
AutoField是自增主键,不需要设置max_length,可以简化:
watchlist_id = models.AutoField(primary_key=True)
修正后的完整代码示例
models.py
from django.db import models from django.contrib.auth.models import User from .models import stock # 确保导入stock模型 class watchlist(models.Model): watchlist_id = models.AutoField(primary_key=True) stock_add_time = models.DateTimeField(auto_now=True) stock = models.ForeignKey(stock, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE, null=True) objects = models.Manager() def __str__(self): return str(self.stock_add_time) class Meta: db_table = "watchlist" verbose_name = 'watchlist name'
views.py
from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from .models import watchlist, stock @login_required(login_url='login') def add_to_watchlist(request): user = request.user stock_id = stock.objects.get(stock_id='1') watchlist.objects.create(stock=stock_id, user=user) return render(request, 'watchlist.html', {})
内容的提问来源于stack exchange,提问作者wai siang
相关产品推荐
相关产品推荐

