ORM中related_name屬性的使用

以web頁面實現省市區展示爲例

 

models.py

from django.db import models

# Create your models here.

class Area(models.Model):
    """省市區"""
    name = models.CharField(max_length=20, verbose_name='名稱')
    parent = models.ForeignKey('self', on_delete=models.SET_NULL, related_name='subs', null=True, blank=True, verbose_name='上級行政區劃')

    class Meta:
        db_table = 'tb_areas'
        verbose_name = '省市區'
        verbose_name_plural = '省市區'

    def __str__(self):
        return self.name
parent = models.ForeignKey('self', on_delete=models.SET_NULL, related_name='subs', null=True, blank=True, verbose_name='上級行政區劃')

參數說明

self: 自關聯

from django.shortcuts import render
from django.views import View
from django import http
import logging
from django.core.cache import cache

from areas.models import Area
from meiduo_mall.utils.response_code import RETCODE
# Create your views here.

logger = logging.getLogger('django')


class AreaView(View):
    """省市區三級聯動"""

    def get(self, request):
        # 判斷當前是要查詢省份數據還是市區數據
        area_id = request.GET.get('area_id')
        if not area_id:
            # 獲取並判斷是否有緩存
            province_list = cache.get('province_list')
            if not province_list:
                # 查詢省級數據
                # Area.objects.filter(屬性名__條件表達式=值)
                try:
                    province_model_list = Area.objects.filter(parent__isnull=True)
                    # 將模型列表轉成字典列表
                    province_list = []
                    for province_model in province_model_list:
                        province_dict = {
                            "id": province_model.id,
                            "name": province_model.name
                        }
                        province_list.append(province_dict)

                    # 緩存省份字典列表數據:默認存儲爲"default"的配置中
                    cache.set('province_list', province_list, 3600)

                except Exception as e:
                    logger.error(e)
                    return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '查詢省份數據錯誤'})
            # else:
            #     return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'province_list': province_list})
            # 響應省級JSON數據
            return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'province_list': province_list})

        else:
            # 判斷是否有緩存
            sub_data = cache.get('sub_area_' + area_id)

            if not sub_data:
                try:
                # 查詢城市或區縣數據
                    parent_model = Area.objects.get(id=area_id)
                    # sub_model_list = parent_model.area_set.all()
                    sub_model_list = parent_model.subs.all()

                    # 將子級模型列表轉成字典列表
                    subs = []
                    for sub_model in sub_model_list:
                        sub_dict = {
                            "id": sub_model.id,
                            "name": sub_model.name,
                        }
                        subs.append(sub_dict)

                    # 構造子級JSON數據
                    sub_data = {
                        "id": parent_model.id,
                        "name": parent_model.name,
                        "subs": subs,
                    }
                    # 緩存城市或者區縣
                    cache.set('sub_area_' + area_id, sub_data, 3600)

                except Exception as e:
                    logger.error(e)
                    return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '查詢城市或區縣數據錯誤'})

            # 響應城市或者區縣JSON數據
            return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'sub_data': sub_data})
# 查詢城市或區縣數據
首先需要取到城市對應的省份,或者區縣對應的城市
    parent_model = Area.objects.get(id=area_id)
由省份查詢城市,或者由城市查詢區縣是一對多的查詢,ORM提供的查詢方式爲:
sub_model_list = parent_model.area_set.all()
由於定義了related_name='subs',則可以使用:
sub_model_list = parent_model.subs.all()

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章