50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
from adrf.serializers import ModelSerializer, CharField, SerializerMethodField
|
|
from .models import ApiCategory, ApiItem, ApiFavorite
|
|
|
|
|
|
class ApiCategorySerializer(ModelSerializer):
|
|
item_count = SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ApiCategory
|
|
fields = ['id', 'name', 'icon', 'sort_order', 'item_count', 'created_at']
|
|
read_only_fields = ['id', 'created_at']
|
|
|
|
async def get_item_count(self, obj):
|
|
return await obj.items.filter(is_enabled=True).acount()
|
|
|
|
|
|
class ApiItemSerializer(ModelSerializer):
|
|
category_name = CharField(source='category.name', read_only=True, default='')
|
|
favorites_count = SerializerMethodField()
|
|
is_favorited = SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ApiItem
|
|
fields = [
|
|
'id', 'name', 'description', 'icon', 'url_path', 'method',
|
|
'category', 'category_name', 'is_enabled', 'is_new', 'is_coming_soon',
|
|
'views_count', 'color', 'image_url', 'sort_order', 'created_at', 'updated_at',
|
|
'favorites_count', 'is_favorited'
|
|
]
|
|
read_only_fields = ['id', 'created_at', 'updated_at']
|
|
|
|
async def get_favorites_count(self, obj):
|
|
return await obj.favorites.acount()
|
|
|
|
async def get_is_favorited(self, obj):
|
|
request = self.context.get('request')
|
|
if request and request.user.is_authenticated:
|
|
return await obj.favorites.filter(user=request.user).aexists()
|
|
return False
|
|
|
|
|
|
class ApiFavoriteSerializer(ModelSerializer):
|
|
api_item_name = CharField(source='api_item.name', read_only=True)
|
|
api_item_url = CharField(source='api_item.url_path', read_only=True)
|
|
|
|
class Meta:
|
|
model = ApiFavorite
|
|
fields = ['id', 'user', 'api_item', 'api_item_name', 'api_item_url', 'created_at']
|
|
read_only_fields = ['id', 'created_at']
|