6.Django_ORM_自关联例子

这里用省市区的关联下拉框为例子

a.1.创建数据模型类poills/models.py

class AddressInfo(models.Model):
    """ 省市县地址信息 """
    address = models.CharField(max_length=100, null=True, blank=True, verbose_name='地址')
    # 自关联方式一:传'self'
    pid = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name='自关联')
    # 自关联方式二:传对应Model中的该字段的名称,比如说叫'AddressInfo'
     # pid = models.ForeignKey('AddressInfo', on_delete=models.CASCADE, null=True, blank=True, verbose_name='自关联')

    def __str__(self):
        """ 给不同的Model对象返回个可读的字符串 """
        return self.address

a.2.数据库迁移,生成表数据

python manage.py  makemigrations    # 生成migrations临时文件
python manage.py  migrate           # 根据migrations直接生成数据库

b.创建对应的视图类polls/views.py

from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from .models import AddressInfo

def address(request):  
    """地址选择页视图"""
    return render(request, 'address.html')  # address.html代码就不放了

class AddressAPI(View):
    """ AddressInfo数据模型类对应的视图类 """
    def get(self, request, address_id):  # 接受一个参数id,即AddressInfo数据模型的pid属性对应的字段,也就是表中的pid
        if int(address_id) == 0:  # 0时表示查询省份,省份的pid_id为null
            address_data = AddressInfo.objects.filter(pid_id__isnull=True).values('id', 'address')
        else:  # 查询市或者区县
            address_data = AddressInfo.objects.filter(pid_id=int(address_id)).values('id', 'address')
        area_list = []  # 转成list,以便后面进行json序列化
        for a in address_data:
            area_list.append({'id': int(a['id']), 'address': a['address']})
        # 因为这里是list而不是dict,所以safe需要为False
        return JsonResponse(area_list, content_type='application/json', safe=False)

c.配置对应的路由polls/urls.py

from django.urls import path

from . import views

urlpatterns = [
    path(r'address', views.address, name='address'),   
    # URL转换器中传递过去的参数名,需要和对应的View方法的参数名一样
    path(r'address/', views.AddressAPI.as_view(), name='address')
]

d.在polls项目下,创建目录templates/pollstemplates,并创建下面的html文件。
address.html




    
    地址信息











e.运行django项目,访问http://localhost:8000/polls/address
结果:此时还没有数据,可以到Djang的admin后台导入数据。

address页

f.创建一个Django后台新用户
命令:manage.py createsuperuser

后台用户

g.注册应用,把刚刚所创建的AddressInfo数据模型类添加到Django后台首页
polls/admin.py

from django.contrib import admin

# Register your models here.

from .models import AddressInfo
admin.site.register(AddressInfo)

h.进入http://localhost:8000/admin/,并登录(为了安全,实际情况会到urls.py修改路径,不使用默认的admin)

后台首页

i.进入表中,添加数据:
进入添加数据
省份数据,无关联

添加广州市,并关联广东省

添加完毕

此时数据表已经加入了数据:
addressinfo表

j.在前端进行操作:
省市区

省市

PS.因为例子使用的之前注册过的应用polls,所以步骤中没有说明注册App这一步。
settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # 注册子应用
    'polls.apps.PollsConfig'
]

你可能感兴趣的:(6.Django_ORM_自关联例子)