Я использую Django Rest Framework для проекта, и у меня есть вложенный сериализатор, подобный этому:
class TopSerializer(serializers.ModelSerializer):
contact = (something goes here)
email = (something goes here)
Для POST, PATCH, PUT, DELETE я хочу указать эти значения с помощью slug.Предположим, что в каждом классе (контакт, электронная почта) есть член с именем resource_id
, и это мой слаг.Для этих методов я мог бы использовать:
class TopSerializer(serializers.ModelSerializer):
contact = serializers.SlugRelatedField(read_only=False, slug_field='resource_id')
email = serializers.SlugRelatedField(read_only=False, slug_field='resource_id')
Тем не менее, для GET я хочу вернуть также встроенные объекты, поэтому я мог бы использовать:
class TopSerializer(serializers.ModelSerializer):
contact = ContactSerializer(read_only=True)
email = EmailSerializers(read_only=True)
Так как мне указать в моемСериализатор, что contact
может быть либо слагом, либо сериализованным объектом?Есть ли способ сделать это только с одним сериализатором, или я должен иметь два разных сериализатора и использовать request.method
в представлении, чтобы выбрать, какой сериализатор я использую?
Или я должен использовать что-то вроде этого:
class TopSerializer(serializers.ModelSerializer):
contact = ContactSerializer(read_only=True)
email = EmailSerializers(read_only=True)
contact_rid = serializers.SlugRelatedField(read_only=False,slug_field=resource_id,queryset=models.Contact.objects.all())
email_rid = serializers.SlugRelatedField(read_only=False,slug_field=resource_id,queryset=models.Email.objects.all())
Таким образом, я могу использовать contact_rid
и email_rid
для POST / PATCH / PUT / DELETE и вернуть поля контактов и электронной почты обратно в GET.
Я на правильном пути?Другие предложения?