Django ForeignKey 外键关联实现与数据库操作详解

Ruby
Ruby
发布时间:2026-10-11 | 3人浏览过
原创

本文详细解析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提供了便捷的迁移工具,通过执行以下命令即可完成:

  1. 运行 python manage.py makemigrations 生成迁移文件。
  2. 运行 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外键关联的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表