序列化作为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上,找到个讨论类似情况的帖子,本文的解决方案也来自这个帖子:
具体方案:
再写一个序列化器来序列化你有外键那个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')
最后,如果要查找到所有关联的层级的数据,可以自己写递归查询的办法的解决,不过这样太费力,查询效率也很低。
如果有同学有其它的办法,欢迎分享!