Sometimes giving a bad answer inspires someone else to give a better one, so here goes:
The data returned will include the property drawer of the heading. It does not include subheadings.
I wrote a quick and ugly function to strip out the property drawer (it also has to remove the properties list associated with the section element, hence excluding :begin), and then returns a string.
(defun get-contents (data)
"DATA is the data returned by (org-dp-contents)"
(let ((contents)
(exclusions '(property-drawer :begin)))
(dolist (element (cdar data))
(unless (memq (car-safe element) exclusions)
(push element contents)))
(org-element-interpret-data (reverse contents))))
I am skeptical that this is a better way then the alternative you described, but do not know. Hopefully someone else can assist.