Django ForeignKey 外键关联实现与数据库操作详解
本文详细解析Django中ForeignKey外键关联的实现方法。通过定义Usergroup与Userinfo模型,演示如何使用makemigrations和migrate命令同步数据库结构。结合views.py与模板文件,展示如何在前端表单提交数据时自动关联外键,并将内容持久化至数据库。
模型定义与外键关联
在Django项目中,实现表间关联的核心在于模型定义。我们需要在 models.py 中创建两张表:一张作为主表(如用户组),另一张作为从表(如用户信息),并通过 ForeignKey 建立关联。
以下代码展示了如何定义 Usergroup 和 Userinfo 模型。在 Userinfo 中,通过 user_group=models.ForeignKey('Usergroup',to_field='uid',default=1) 指定外键字段。这里 to_field='uid' 表示关联到 Usergroup 表的 uid 字段,而 default=1 则设定了默认关联的组ID。
class Usergroup(models.Model):
uid=models.AutoField(primary_key=True)
caption=models.CharField(max_length=64,null=True)
ctime=models.DateField(auto_now_add=True,null=True)
uptime=models.DateField(auto_now=True,null=True)
class Userinfo(models.Model):
username=models.CharField(max_length=32,blank=True)
password=models.FileField(max_length=60,help_text='pwd')
email=models.CharField(max_length=60)
test=models.EmailField(max_length=20,null=True,error_messages={'invalid':'shurumima'})
user_group=models.ForeignKey('Usergroup',to_field='uid',default=1) #这里与上面的Usergroup表的uid进行关联,默认取到uid=1的行)
user_type_choices=(
(1,'superuser'),
(2,'commonuser'),
(3,'com-commonuser'),
)
user_type_id=models.IntegerField(choices=user_type_choices,default=1)数据库迁移与同步
模型定义完成后,必须将变更同步到数据库。Django提供了便捷的迁移工具,通过执行以下命令即可完成:
- 运行
python manage.py makemigrations生成迁移文件。 - 运行
python manage.py migrate将迁移应用到数据库。
这两个步骤确保了 Usergroup 和 Userinfo 表在数据库中实际存在,并建立了外键约束。
视图逻辑与数据提交
在 views.py 中,我们需要处理前端提交的数据,并将其写入数据库。以下代码展示了 user_info 视图函数的实现:
def user_info(request):
if request.method == "GET":
#userlist = test.objects.all()
userlist2=models.Userinfo.objects.all() #获取Userinfo表的所有信息
# return render(request,'userinfo.html',{'userlist':userlist})
return render(request, 'userinfo.html', {'userlist2': userlist2}) #模板引用
elif request.method == "POST":
u = request.POST.get('user')
pp= request.POST.get('pwd')
#test.objects.create(username=u,depno=pp)
models.Userinfo.objects.create(username=u,password=pp,user_group_id=1)
return HttpResponse("<p>注册成功</p>")在 POST 请求处理中,通过 models.Userinfo.objects.create(username=u,password=pp,user_group_id=1) 创建新用户记录。这里 user_group_id=1 显式指定了外键关联的组ID,确保数据写入时正确关联到 Usergroup 表。
模板渲染与前端展示
前端模板 userinfo.html 负责展示用户列表和处理表单提交。通过 {% for i in userlist2 %} 循环遍历用户数据,并利用 {{ i.user_group.caption }} 获取关联的用户组名称。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>666666(runoob.com)</title>
</head>
<body style="background-color:silver">
<div>
<div style="color:#00FF00">
<a class="menu" href="/home-bak" rel="external nofollow" >是爷们儿就点下 </a>
<br /> <a class="menu" href="/group" rel="external nofollow" >是爷们儿就洅点下 </a>
</div>
<div style="color:#666644">
<h3>添加主机</h3>
<form method="POST" action="/userinfo">
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
<input type="text" name="user">
<input type="text" name="pwd">
<input type="submit" name="添加">
</form>
<h3>主机列表</h3>
<ul>
{% for i in userlist2 %}
<li><a href="/datail" rel="external nofollow" >{{ i.username }}</a>
<span>{{ i.user_group.caption }}</span>
</li>
{% endfor %}
</ul>
</div>
</div>
</body>
</html>在表单中,通过 <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> 防止跨站请求伪造攻击。用户提交数据后,Django会自动将内容添加到数据库,并通过外键关联获取对应的组信息。
路由配置与项目启动
最后,需要在 urls.py 中添加对应的路由配置,将 /userinfo 路径映射到 user_info 视图函数。完成配置后,执行项目启动命令,即可在浏览器中访问页面,实现数据的添加与展示。




以上就是Django ForeignKey外键关联实现与数据库操作的详细内容,更多关于Django外键关联的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













