Получение объектов перед проверкой данных Django REST
Мне нужно создать новый Chat объект, используя этот вид:
class ChatListCreateView(ListCreateAPIView):
permission_classes = [IsAuthenticated]
serializer_class = ChatSerializer
def get_queryset(self):
data = Chat.objects.filter(
Q(employees=self.request.user) | Q(created_by=self.request.user)).distinct()
return data
Сериализатор, который он использует, следующий:
class ChatSerializer(serializers.ModelSerializer):
created_by = SimpleEmployeeSerializer(read_only=True)
employees = SimpleEmployeeSerializer(many=True, read_only=True)
title = serializers.CharField(max_length=255)
def create(self, validated_data):
"""
Creates a new Chat and adds the m2m employees to it
"""
# Create and save the chat
chat = Chat.objects.create(
created_by=self.context['request'].user,
title=validated_data['title'],
)
# Add the employees to the chat
validated_employees = validated_data.pop('employees')
for user_id in validated_employees:
employee = Employee.objects.get(id=user_id)
chat.employees.add(employee)
return chat
Моя проблема в том, что SimpleEmployeeSerializer ожидает объект user, но я передаю массив employees в таком виде:
{
"title": "fwef",
"employees": [
{
"id": "8"
},
{
"id": "30"
}
]
}
Какой метод я могу реализовать, чтобы получить объекты из этих идентификаторов перед валидацией?
Здравствуйте Дэвид вы можете воспользоваться преимуществом переопределения метода validate в сериализаторе вы должны сделать что-то вроде следующего:
class ChatSerializer(serializers.ModelSerializer):
created_by = SimpleEmployeeSerializer(read_only=True)
employees = SimpleEmployeeSerializer(many=True, read_only=True)
title = serializers.CharField(max_length=255)
def validate_employees(self, value):
#value= transform_ids_in_objects(value)
# if errors:
# raise ValidationError("Something bad happened")
return value
def create(self, validated_data):
chat = Chat.objects.create(
created_by=self.context['request'].user,
title=validated_data['title'],
)
# ... More code here
return chat
Документация о методе validate Нечто важное о методе validate заключается в том, что этот метод вызывается перед методом create.
Думаю, вам нужно добавить поле employee_ids в сериализатор.
class ChatSerializer(serializers.ModelSerializer):
created_by = SimpleEmployeeSerializer(read_only=True)
employees = SimpleEmployeeSerializer(many=True, read_only=True)
title = serializers.CharField(max_length=255)
employee_ids = serializers.ListField(
child=serializers.IntegerField(), write_only=True
)
def create(self, validated_data):
"""
Creates a new Chat and adds the m2m employees to it
"""
employee_ids = validated_data.pop("employee_ids")
# Create and save the chat
chat = Chat.objects.create(
created_by=self.context['request'].user,
title=validated_data['title'],
)
# Add the employees to the chat one by one
for user_id in employee_ids:
try:
employee = Employee.objects.get(id=user_id)
chat.employees.add(employee)
except Employee.DoesNotExist:
continue
# Or you can add multiple objects at once
# chat.employees.set(employee_ids)
return chat
И вы можете загрузить данные в формате json следующим образом.
{
"title": "fwef",
"employees": [
8, 30
]
}