Почему сериализатор моделей сохраняет неполные данные?
class CreateWithIpMixin:
def create(self, request, *args, **kwargs):
created_by = request.user.id
created_by_ip = request.META.get("REMOTE_ADDR")
#############
creator_info = {'created_by': created_by, "created_by_ip": created_by_ip}
data = {**request.data, **creator_info}
serializer = self.get_serializer(data=data)
#############
serializer.is_valid(raise_exception=True)
serializer.save()
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
request.data = {'name': 'Delhi', 'display_name': 'Delhi', 'short_code': 'DL', 'is_approved': True}
>data = {'name': 'Delhi', 'display_name': 'Delhi', 'short_code': 'DL', 'is_approved': True, 'created_by': 4, 'created_by_ip': '127.0.0.1'}
Я передаю полные данные в сериализатор, но получаю только request.data в моем сериализаторе (метод validate). Два других поля 'created_by' , 'created_by_ip' присутствуют в моей модели, но я хочу заполнить эти колонки автоматически, поэтому я не указал их в полях сериализатора, также я не хочу возвращать их после сохранения данных.
Serializer.py
class StateSerializer(serializers.ModelSerializer):
class Meta:
model = States
fields = [
"id",
"name",
"display_name",
"short_code",
]
def validate(self, attrs):
print(attrs, "Attrs")
return super().validate(attrs)
Я не понимаю, почему вы не хотите включить эти поля в сериализатор, если вы передаете creator_info для их заполнения.
Если вы не упомянете эти поля в fields, то они будут отброшены при проверке сериализатора.
Оу. Кажется, я понял. Если вы хотите удалить некоторые поля из сериализатора, то у вас есть несколько вариантов.
- Сериализаторы разделения
Сделайте CreateStateSerializer, который будет принимать все необходимые поля. Сделайте ReturnStateSerializer, который будет возвращать только те данные, которые вы хотите вернуть.
Тогда просто сделайте что-то вроде:
creator_info = {'created_by': created_by, "created_by_ip": created_by_ip}
data = {**request.data, **creator_info}
create_serializer = CreateStateSerializer(data=data)
create_serializer.is_valid(raise_exception=True)
create_serializer.save()
return_serializer = ReturnStateSerializer(**create_serializer.data)
return_serializer.is_valid(raise_exception=True)
pop() поля из данных сериализатора
serializer.pop("created_by")
serializer.pop("created_by_ip")