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
测试:
详情页