I have 2 models: Folder and Entity.
class Folder(models.Model):
name = models.CharField(max_length=255, null=False, blank=False)
parent = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, related_name="child")
class Entity(models.Model):
name = models.CharField(max_length=255, null=False, blank=False)
folder = models.ForeignKey('Folder', on_delete=models.SET_NULL, null=True, blank=True, related_name="entities")
So a folder can have both child folders and entities. Now I want to send the data in a tree structure and I have written a serializer for it.
class ListFolderSerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
model = Folder
fields = ['id', 'name', 'children']
def get_children(self, instance):
child_folders = Folder.objects.filter(parent=instance).order_by("name")
child_entities = Entity.objects.filter(folder=instance).order_by("name")
all_children = []
if child_folders or child_entities:
child_folders_data = ListFolderSerializer(child_folders, many=True).data
child_entities_data = ListEntitySerializer(child_entities, many=True).data
all_children.extend(child_folders_data)
all_children.extend(child_entities_data)
return all_children
else:
return None
class ListEntitySerializer(serializers.ModelSerializer):
class Meta:
model = Entity
fields = ['id', 'name']
This is working fine but as the data keep on increasing the time to get this tree is increasing. So any optimized way to do this?