I have worked around the problem. Instead of editing the asset model directly through save_formset, I have used save_model on the parent, and used that to edit the child. Thus:
def save_model(self, request, obj, form, change):
# save the object first so we get an id number etc.
obj.save()
obj.asset.save()
# determine the URL
url='{}{}'.format(HOMEURL,obj.get_absolute_url())
# build a qr code
qr = qrcode.QRCode(box_size=3)
qr.add_data( 'FloWave TT {} {}'.format(obj,url))
qr.make(fit=True)
img=qr.make_image()
# save to memory
img_io= StringIO.StringIO()
img.save(img_io,'PNG')
img_file=InMemoryUploadedFile(img_io, None, 'qr{}.png'.format(obj.id), 'image/png', img_io.len, None)
# update the object record with the qrcode
obj.asset.qrcode=img_file
obj.asset.save()
obj.save()