84 lines
3.1 KiB
Python
84 lines
3.1 KiB
Python
from django.contrib.auth.models import User
|
|
from rest_framework import serializers
|
|
|
|
from drf_yasg.utils import swagger_serializer_method
|
|
from snippets.models import Snippet
|
|
|
|
try:
|
|
import typing # noqa: F401
|
|
from .method_serializers_with_typing import MethodFieldExampleSerializer
|
|
except ImportError:
|
|
from .method_serializers_without_typing import MethodFieldExampleSerializer
|
|
|
|
|
|
class OtherStuffSerializer(serializers.Serializer):
|
|
foo = serializers.CharField()
|
|
|
|
|
|
class UserSerializerrr(serializers.ModelSerializer):
|
|
snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())
|
|
article_slugs = serializers.SlugRelatedField(read_only=True, slug_field='slug', many=True, source='articles')
|
|
last_connected_ip = serializers.IPAddressField(help_text="i'm out of ideas", protocol='ipv4', read_only=True)
|
|
last_connected_at = serializers.DateField(help_text="really?", read_only=True)
|
|
|
|
other_stuff = serializers.SerializerMethodField(
|
|
help_text="the decorator should determine the serializer class for this")
|
|
|
|
hint_example = MethodFieldExampleSerializer()
|
|
|
|
@swagger_serializer_method(serializer=OtherStuffSerializer)
|
|
def get_other_stuff(self, obj):
|
|
"""
|
|
method_field that uses a serializer internally.
|
|
|
|
By using the decorator, we can tell drf-yasg how to represent this in Swagger
|
|
:param obj:
|
|
:return:
|
|
"""
|
|
return OtherStuffSerializer().data
|
|
|
|
help_text_example_1 = serializers.SerializerMethodField(
|
|
help_text="help text on field is set, so this should appear in swagger"
|
|
)
|
|
|
|
@swagger_serializer_method(serializer=serializers.IntegerField(
|
|
help_text="decorated instance help_text shouldn't appear in swagger because field has priority"))
|
|
def get_help_text_example_1(self):
|
|
"""
|
|
method docstring shouldn't appear in swagger because field has priority
|
|
:return:
|
|
"""
|
|
return 1
|
|
|
|
help_text_example_2 = serializers.SerializerMethodField()
|
|
|
|
@swagger_serializer_method(serializer=serializers.IntegerField(
|
|
help_text="instance help_text is set, so should appear in swagger"))
|
|
def get_help_text_example_2(self):
|
|
"""
|
|
method docstring shouldn't appear in swagger because decorator has priority
|
|
:return:
|
|
"""
|
|
return 1
|
|
|
|
help_text_example_3 = serializers.SerializerMethodField()
|
|
|
|
@swagger_serializer_method(serializer=serializers.IntegerField())
|
|
def get_help_text_example_3(self):
|
|
"""
|
|
docstring is set so should appear in swagger as fallback
|
|
:return:
|
|
"""
|
|
return 1
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ('id', 'username', 'email', 'articles', 'snippets',
|
|
'last_connected_ip', 'last_connected_at', 'article_slugs', 'other_stuff', 'hint_example',
|
|
'help_text_example_1', 'help_text_example_2', 'help_text_example_3')
|
|
|
|
|
|
class UserListQuerySerializer(serializers.Serializer):
|
|
username = serializers.CharField(help_text="this field is generated from a query_serializer", required=False)
|
|
is_staff = serializers.BooleanField(help_text="this one too!", required=False)
|