В django-rest-framework есть готовая аутентификация по токенам, но в модели токен связывается с юзером как OneToOneField (создаётся unique constraint). Для моей задачи нужна связь ForeignKey, чтобы с разных устройств у юзера был отдельный токен со своим временем жизни.
Как на лету пропатчить одну модель в drf?
В джанге у метакласса модели есть Model.add_to_class('fieldname', field)
, которым можно добавлять/изменять поля в уже описанных классах моделей, но заменить OneToOneField на ForeignKey им не получается, появляются конфликты (или надо пытаться лучше?).
Лезть самому в Model._meta.local_fields
страшновато, там кроме полей ещё много магии с созданием связей между моделями.
Чому нет готового метода "удолить филд полностью со всеми ссылками", чтобы затем добавить новый без конфликтов? Остаётся фолбек "скопировать drf целиком в свой проект и там заменить тип поля", но очень уж некрасиво.
@anarchy >удали старое
боялся что-нибудь проебать, но вроде работает просто удаление и создание нового поля с таким же именем без переназначения ссылок (они ссылаются на имя, которое осталось прежним)
python
for field in Token._meta.local_fields[:]:
if field.name == 'user':
Token._meta.local_fields.remove(field)
Token.add_to_class('user', models.ForeignKey(AUTH_USER_MODEL, related_name='+',
on_delete=models.CASCADE, verbose_name=_('User')))
@anarchy проверил, не похерились. в миграции AlterField, а не дроп/криейт (джанговские миграции вообще не дропают поля на всякий случай, если я правильно помню).