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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值