模型类---自关联
from django.db import models
class Classify(models.Model):
classify = models.CharField(max_length=100, verbose_name="商品分类")
pid = models.ForeignKey(to="self", on_delete=models.CASCADE,
verbose_name="关联id", null=True, default=None,
blank=True, related_name="aaa")
def __str__(self):
return self.classify
class Meta:
db_table = "classify"
verbose_name_plural = "分类"
后端数据展示
一级标题展示和添加
class ClassifyAPIView(APIView):
def get(self, request):
cls = Classify.objects.filter(pid=None)
temp = []
for i in cls:
temp_dict = {
"id": i.id,
"classify": i.classify
}
temp.append(temp_dict)
return Response({
"code": 200,
"msg": "展示成功",
"data": temp
})
def post(self, request):
classify = request.data.get("classify")
if not classify:
return Response({"code": 400, "msg": "数据不能为空"})
try:
Classify.objects.create(classify=classify, pid_id=None)
except Exception as e:
print(e.args)
return Response({"code": 400, "msg": "添加失败"})
return Response({"code": 200, "msg": "添加成功"})
二级分类的展示和添加
class TwoAPIView(APIView):
def get(self, request):
id = request.query_params.get("id")
cls = Classify.objects.filter(pid_id=id)
temp = []
for i in cls:
temp_dict = {
"id": i.id,
"classify": i.classify,
"pid": i.pid_id
}
temp.append(temp_dict)
return Response({
"code": 200,
"msg": "展示成功",
"data": temp
})
def post(self, request):
id = request.data.get("id")
cls = request.data.get("classify")
if not all([id, cls]):
return Response({"code": 400, "msg": "数据不能为空"})
try:
Classify.objects.create(classify=cls, pid_id=id)
except Exception as e:
print(e.args)
return Response({"code": 400, "msg": "添加失败"})
return Response({"code": 200, "msg": "添加成功"})
路由
from django.urls import path
from .views import *
urlpatterns = [
# 一级标题
path("cls/", ClassifyAPIView.as_view()),
# 二级标题
path("two/", TwoAPIView.as_view())
]
小结
- 多级分类应用了自关联,自己关联自己,用一个pid字段来区分每一级
- pid设置属性的时候要加空字段,null=True, default=None, blank=True
- 标准格式:pid = models.ForeignKey(to="self", on_delete=models.CASCADE,
verbose_name="关联id", null=True, default=None,
blank=True, related_name="aaa")- 下一级关联上一级的id