django 关系模型外键自关联实例——省市区三级联动
自关联 顾名思义 自己关联自己
下面这个例子将会讲到自管理(省市区 三级联动的例子)
- 省的上一级(parant)为None
- 市的上一级(parant)为省
- 区的上一级(parant)为市
如果查到一地区的parant为None说明它是省一级地区,如果不为None就可以知道该地区是那个省那个市那个区的了
模型类:
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 = 'area'
verbose_name= '行政区划'
verbose_name_plural = verbose_name
序列器:
class AreaSer(serializers.ModelSerializer):
class Meta:
model = Area
fields = ('id','name')class SubSer(serializers.ModelSerializer):
# 外键 序列化
subs = AreaSer(many=True,read_only=True)class Meta:
model = Area
fields =('id','name','subs')
视图:只进行查询操作 所以选用ReadOnlyModelViewSet视图集
class AreaView(ReadOnlyModelViewSet):
# 重写获取查询集以及序列化器类
def get_queryset(self):
if self.action == 'list':
return models.Area.objects.filter(parent=None)
else:
return models.Area.objects.all()def get_serializer_class(self):
if self.action == 'list':
return ser.AreaSer
else:
return ser.SubSer
路由:
router = DefaultRouter()
router.register(r'areas', views.AreaView, base_name='areas')
urlpatterns += router.urls
测试:
详情页
————————————————
版权声明:本文为CSDN博主「happy_leizi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/happy_leizi/article/details/88662952