This is way cleaner. I have two bits of feedback and then I'm ready to approve:

* I think it should be `and not val`. This would set a FK to `None` if you sent a JSON value of `null`, `0`, `''`, or `false`, which might not be perfect (as some PKs could technically be 0), but it would allow me to actually set it as `null` and have it unset accordingly.
* We should clean up this code along with the below so that the `data[smart_str(field)]` is only called once. Maybe set `clean_value` or `final_value` in this if/else along with the else below and do one assign after this total code block?