Как заполнить оставшиеся поля базы данных на сервере в django

Я новичок в django и создаю конечные точки API, используя django rest framework.

Я создал пост-запрос, чтобы пользователь заполнил тело запроса, которое находится в json, и этот json будет добавлен в таблицу базы данных, но изюминка в том, что пользователь должен заполнить только несколько полей, а остальные поля будут добавлены на стороне сервера.

Например, допустим, что в таблице базы данных есть поля номер_комнаты, check_in, check_out, дата, вместимость. Пользователь будет заполнять только поля check_in, check_out, date, а остальные поля будут заполнены на сервере.

Может кто-нибудь подскажет мне, как я могу это сделать?

Из документа, есть несколько подходов к этому решению:

  1. обновить сериализатор

В сериализаторе вы могли бы иметь что-то вроде этого, чтобы изменить данные перед сохранением:

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
  1. Передача дополнительных атрибутов в .save():

Передача дополнительных атрибутов в .save() Иногда вы хотите, чтобы код представления мог передавать дополнительные данные в момент сохранения экземпляра. Эти дополнительные данные могут включать информацию о текущем пользователе, текущем времени или что-нибудь еще, что не является частью данных запроса.

Вы можете сделать это, включив дополнительные аргументы ключевого слова при вызове .save(). Например:

serializer.save(room_number=your_custom_value, capacity=your_custom_value)

Любые дополнительные аргументы ключевых слов будут включены в аргумент validated_data при вызове .create() или .update().

  1. Переопределение .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 напрямую.

Вернуться на верх