Как заполнить оставшиеся поля базы данных на сервере в django
Я новичок в django и создаю конечные точки API, используя django rest framework.
Я создал пост-запрос, чтобы пользователь заполнил тело запроса, которое находится в json, и этот json будет добавлен в таблицу базы данных, но изюминка в том, что пользователь должен заполнить только несколько полей, а остальные поля будут добавлены на стороне сервера.
Например, допустим, что в таблице базы данных есть поля номер_комнаты, check_in, check_out, дата, вместимость. Пользователь будет заполнять только поля check_in, check_out, date, а остальные поля будут заполнены на сервере.
Может кто-нибудь подскажет мне, как я могу это сделать?
Из документа, есть несколько подходов к этому решению:
- обновить сериализатор
В сериализаторе вы могли бы иметь что-то вроде этого, чтобы изменить данные перед сохранением:
class YourModelSerializer(serializers.ModelSerializer):
class Meta:
model = YourModel
fields = ['check_in', 'check_out', 'date']
def create(self, validated_data):
validated_data['room_number'] = your_custom_value
validated_data['capacity'] = your_custom_value
return YourModel.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.check_in = validated_data.get('check_in', instance.check_in)
instance.check_out = validated_data.get('check_out', instance.check_out)
instance.date = validated_data.get('date', instance.date)
instance.room_number = your_custom_value
instance.capacity = your_custom_value
instance.save()
return instance
- Передача дополнительных атрибутов в .save():
Передача дополнительных атрибутов в .save() Иногда вы хотите, чтобы код представления мог передавать дополнительные данные в момент сохранения экземпляра. Эти дополнительные данные могут включать информацию о текущем пользователе, текущем времени или что-нибудь еще, что не является частью данных запроса.
Вы можете сделать это, включив дополнительные аргументы ключевого слова при вызове .save(). Например:
serializer.save(room_number=your_custom_value, capacity=your_custom_value)
Любые дополнительные аргументы ключевых слов будут включены в аргумент validated_data при вызове .create() или .update().
- Переопределение .save() напрямую.
В некоторых случаях имена методов .create() и .update() могут не иметь смысла. Например, в контактной форме мы можем не создавать новые экземпляры, а вместо этого отправлять электронное или другое сообщение.
В этих случаях вы можете вместо этого переопределить .save() напрямую, как более читабельный и осмысленный.
Например:
class ContactForm(serializers.Serializer):
email = serializers.EmailField()
message = serializers.CharField()
def save(self):
email = self.validated_data['email']
message = self.validated_data['message']
send_email(from=email, message=message)
Обратите внимание, что в приведенном выше случае нам приходится обращаться к свойству serializer .validated_data напрямую.