Django外键使用示例:实现类似Left Join的数据关联

清欢
清欢
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍Django中如何使用ForeignKey建立模型间关系,替代原生SQL的Left Join操作。通过定义Province、School和Person模型,利用ModelForm简化表单处理,并在视图中保存数据。模板中通过外键字段访问关联表属性,实现数据的完整展示与操作。

Django外键使用示例:实现类似Left Join的数据关联

Django外键使用示例:实现类似Left Join的数据关联

外键关联与模型封装

由于Django将数据库表封装为模型以保障安全与便利,许多原生SQL功能(如Left Join)无法直接使用。此时,可以通过定义外键(ForeignKey)来建立表与表之间的关联关系。

模型定义

模型定义


# 在models.py 中添加
# Person 模型有两个外键, School和Province
# 
class Province(models.Model):
  name = models.CharField('省份', max_length = 10)
  post = models.CharField('邮编', max_length = 10)
  def __str__ (self):#在Python2中用__unicode__替换__str__
    return self.name

# class School_Type(models.Model):
#   school_type = models.CharField('学校类别')

class School(models.Model):
  id = models.IntegerField('学校编号', primary_key=True)
  name = models.CharField('学校名称', max_length=200)
  address = models.CharField('学校地址', max_length=200)

  def __str__ (self):#在Python2中用__unicode__替换__str__
    return self.name




class Person(models.Model):
  name = models.CharField('姓名', max_length=50)
  age = models.IntegerField('年龄')
  address = models.CharField('地址', max_length=100)
  email = models.EmailField('电子邮件')
  school = models.ForeignKey(School, on_delete=models.CASCADE)
  province = models.ForeignKey(Province, on_delete = models.CASCADE)

ModelForm配置

ModelForm配置

由于Form的字段与Model的字段一致,可直接使用ModelForm。在使用ModelForm时,外键字段会显示为ChoiceField,其显示内容为__str__()方法返回的字符串。

ModelForm配置代码示例


# 因为Form的字段跟model的字段相同,所以我们直接使用 ModelForm

class PersonForm(ModelForm):
  class Meta:
    model = Person
    fields = '__all__'

数据保存

数据保存

视图保存逻辑


views.py 中的view,可以直接使用 form.save() 来保存form

def person(request):
  if request.POST:
    form = PersonForm(request.POST)

    if form.is_valid():
      p = form.save()
      return HttpResponse(request, 'success')
    else:
      return HttpResponse(request, 'fail')
  else:
    form = PersonForm()
    person_list = Person.objects.all()
    # school_list = person_list.School_set.all()
    return render(request, 'person.html', locals())

模板文件person.html

模板文件person.html

在模板中,可以通过person.外键字段.外键表属性的方式访问关联数据,例如通过person.school.province.post获取省份邮编信息。

模板代码示例


{% extends 'base.html' %}

{% block content %}

  <form action="." method="POST">
  {% csrf_token %}
  {{ form }}
  <input type="submit" value='submit' />

  </form>

{#  #}
  {% for person in person_list %}

  <p>name:{{ person.name }}; age: {{ person.age }}; school:{{ person.school}}
     {{ person.province.post }}
  </p>
{% endfor %}
{#  {{ school_list }}#}

{% endblock %}

总结

以上即为Django中ForeignKey外键使用的完整示例,旨在帮助开发者理解如何利用外键实现类似Left Join的数据关联功能。希望本文内容对读者有所帮助,欢迎继续支持本站获取更多技术分享。

本站声明

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

Python 相关产品和应用

全部下载

专题列表