{"action":"created","issue":{"url":"https://api.github.com/repos/ookami-kb/django-simple-helpdesk/issues/7","repository_url":"https://api.github.com/repos/ookami-kb/django-simple-helpdesk","labels_url":"https://api.github.com/repos/ookami-kb/django-simple-helpdesk/issues/7/labels{/name}","comments_url":"https://api.github.com/repos/ookami-kb/django-simple-helpdesk/issues/7/comments","events_url":"https://api.github.com/repos/ookami-kb/django-simple-helpdesk/issues/7/events","html_url":"https://github.com/ookami-kb/django-simple-helpdesk/pull/7","id":153592559,"number":7,"title":"Issue 6","user":{"login":"stpnk","id":1956123,"avatar_url":"https://avatars.githubusercontent.com/u/1956123?v=3","gravatar_id":"","url":"https://api.github.com/users/stpnk","html_url":"https://github.com/stpnk","followers_url":"https://api.github.com/users/stpnk/followers","following_url":"https://api.github.com/users/stpnk/following{/other_user}","gists_url":"https://api.github.com/users/stpnk/gists{/gist_id}","starred_url":"https://api.github.com/users/stpnk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stpnk/subscriptions","organizations_url":"https://api.github.com/users/stpnk/orgs","repos_url":"https://api.github.com/users/stpnk/repos","events_url":"https://api.github.com/users/stpnk/events{/privacy}","received_events_url":"https://api.github.com/users/stpnk/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":1,"created_at":"2016-05-07T12:39:38Z","updated_at":"2016-05-07T20:32:37Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/ookami-kb/django-simple-helpdesk/pulls/7","html_url":"https://github.com/ookami-kb/django-simple-helpdesk/pull/7","diff_url":"https://github.com/ookami-kb/django-simple-helpdesk/pull/7.diff","patch_url":"https://github.com/ookami-kb/django-simple-helpdesk/pull/7.patch"},"body":"\r\nПроблему загрузки вложений к комментариям решил следующим образом:\r\nВынес поле для загрузки файла в отдельную модель. В модели MailAttachment сделал OneToOneField на модель, содержащую файл. Таким образом, пользователь может начать загружать файлы, а сам, тем временем, может начать писать комментарий. \r\n\r\nПосле успешной загрузки файла, возвращается json, в котором есть 'id' только что загруженного файла.\r\nМожно запомнить этот 'id'.\r\nПри отправке комментария, помимио 'body' и 'internal' можно заполнить 'attachments_ids' (только для записи) - кладем в это поле 'id' загруженных файлов (если несколько, то записываем через запятую). Это ведь несложно сделать на фронтенде? \r\nИ, далее post() метод парсит поле 'attachment_ids' и создает MailAttachments со ссылками на файлы, 'id' которых мы указали.\r\n\r\nБольшую часть post() метода занимает именно парсинг этого поля. для парсинга строки с 'id' используется literal_eval(). Постарался предусмотреть случаи когда результом является как один 'id', так и несколько. Сейчас, если возникают какие-то исключения, то молча их пропускаем. Но, возможно, стоит изменить это поведение.  \r\n\r\nДобавил немного комментариев к коду, чтобы было понятнее. Также написал простой тест на создание комментария с вложениями. Тесты API выделил в отдельный файл. Запустить можно так: python manage.py test --pattern=\"api_tests.py\"\r\n\r\nДля поля comment_id использовал UUIDField из Django. Оно генерирует uuid1 автоматически при создании объекта.\r\n\r\nБуду признателен за советы, как это можно упростить."},"comment":{"url":"https://api.github.com/repos/ookami-kb/django-simple-helpdesk/issues/comments/217667063","html_url":"https://github.com/ookami-kb/django-simple-helpdesk/pull/7#issuecomment-217667063","issue_url":"https://api.github.com/repos/ookami-kb/django-simple-helpdesk/issues/7","id":217667063,"user":{"login":"ookami-kb","id":853356,"avatar_url":"https://avatars.githubusercontent.com/u/853356?v=3","gravatar_id":"","url":"https://api.github.com/users/ookami-kb","html_url":"https://github.com/ookami-kb","followers_url":"https://api.github.com/users/ookami-kb/followers","following_url":"https://api.github.com/users/ookami-kb/following{/other_user}","gists_url":"https://api.github.com/users/ookami-kb/gists{/gist_id}","starred_url":"https://api.github.com/users/ookami-kb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ookami-kb/subscriptions","organizations_url":"https://api.github.com/users/ookami-kb/orgs","repos_url":"https://api.github.com/users/ookami-kb/repos","events_url":"https://api.github.com/users/ookami-kb/events{/privacy}","received_events_url":"https://api.github.com/users/ookami-kb/received_events","type":"User","site_admin":false},"created_at":"2016-05-07T20:32:37Z","updated_at":"2016-05-07T20:32:37Z","body":"В принципе, можно сильно не усложнять логику, и разрешать только массивы id для файлов, тогда можно обойтись IntegerField(many=True).\r\n\r\nИ, кстати, я бы даже сделал не целочисленные id, а тот же UUID - иначе получается уязвимость, когда можно через API послать не тот файл, который ты только что загрузил."}}