django rest framework 自关联外键序列化的一些方式

序列化作为django rest framework 的一大神器,在工作中能帮我们做很多的事情。但是在碰到自关联外键序列化时,我查了官方文档,也有一个关于这个的序列化:

class AccountSerializer(serializers.ModelSerializer):
    url = serializers.CharField(source='get_absolute_url', read_only=True)
    groups = serializers.PrimaryKeyRelatedField(many=True)

    class Meta:
        model = Account

但不知道是操作没对还是有东西没有设置好,反正就是不好用,达不到将外键关联的数据全部拿出来的效果。

另: 在序列化的时候,如果直接写本类的类名作为字段的序列化器是通不过编译的!这点上,可以通过前置声明的方式来强制解决,但是效果也不好。

后面在stackoverflow上,找到个讨论类似情况的帖子,本文的解决方案也来自这个帖子: 

https://stackoverflow.com/questions/33487419/django-rest-framework-nested-serializer-with-self-referential-objects

具体方案:

再写一个序列化器来序列化你有外键那个model,在字段用引用的时候,直接用这个model,这样能解决问题,不过查到的数据只能深入一层!

class Section(models.Model):
    title = models.CharField(max_length=255)
    report = models.ForeignKey(Report)
    order = models.PositiveIntegerField()
    section = models.ForeignKey('self', related_name='section_section', blank=True, null=True)
    content = models.TextField(blank=True)


class SubsectionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Section

class SectionSerializer(serializers.ModelSerializer):
    section = serializers.SubsectionSerializer()
    class Meta:
        model = Section
        fields = ('id', 'title', 'report', 'order', 'section', 'content')

最后,如果要查找到所有关联的层级的数据,可以自己写递归查询的办法的解决,不过这样太费力,查询效率也很低。

如果有同学有其它的办法,欢迎分享!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值