class MenuUserActionSerializer(serializers.ModelSerializer):
brand = BrandSerializer(source="menu.brand")
menu = MenuSerializer(read_only=True)
menu_list = serializers.SerializerMethodField()
@classmethod
def get_menu_list(cls, obj):
menu_qs = Menu.objects.raw(
f"""
WITh RECURSIVE menu_parent(id, parent_id, name, level, path, cycle) as (
SELECT id,
parent_id,
name,
level,
array[id],
false
FROM brand_menu
WHERE id = {obj.menu.id}
UNION ALL
SELECT p.id,
p.parent_id,
p.name,
p.level,
array_append(c.path, p.id),
p.id = any(c.path)
FROM brand_menu p, menu_parent c
WHERE p.id = c.parent_id
AND not cycle
)
SELECT * from menu_parent
order by level
"""
)
menu_list_se = MenuSerializer(menu_qs, many=True)
return menu_list_se.data
class Meta:
model = MenuUserAction
fields = "__all__"