Пользовательское поле - получено несколько значений для аргумента ключевого слова 'related_name'
Я работаю над пользовательским полем, которое является просто ярлыком ForeignKey, указывающим на addresses.Country модель.
Когда я запускаю makemigrations, он возвращает эту ошибку, в которой я не уверен:
TypeError: Couldn't reconstruct field rsft_country on properties.Property: django.db.models.fields.related.ForeignKey.__init__() got multiple values for keyword argument 'to'
Я понимаю, что передается два аргумента to, но не понимаю почему. Похоже, что поле инициализируется два раза. Один раз с kwargs, который я предоставил, а затем со всеми kwargs.
class RsftCountryField(models.ForeignKey):
def __init__(self, verbose_name=None, **kwargs):
print(kwargs)
kwargs['verbose_name'] = verbose_name or 'Krajina'
to = 'addresses.Country'
on_delete = kwargs.pop('on_delete',None) or models.PROTECT
related_name = kwargs.pop('related_name',None) or '+'
super().__init__(to, on_delete, related_name=related_name, related_query_name=None,
limit_choices_to=None, parent_link=False, to_field=None,
db_constraint=True, **kwargs)
Модель:
...
rsft_country = addresses_fields.RsftCountryField(null=True, blank=True)
Он печатает kwargs два раза:
{'null': True, 'blank': True}
{'blank': True, 'null': True, 'related_name': '+', 'on_delete': <function PROTECT at 0x7fa9fa277d00>, 'to': 'addresses.country'}
Почему он это делает и как заставить его работать?
РЕДАКТИРОВАНИЕ:
По сути, я просто хочу предоставить все поля по умолчанию без необходимости указывать их каждый раз, когда я определяю поле country в модели.
Проблема заключается в методе .deconstruct() [Django-doc], поскольку это будет :
class RsftCountryField(models.ForeignKey):
def __init__(self, verbose_name=None, **kwargs):
kwargs['verbose_name'] = verbose_name or 'Krajina'
to = 'addresses.Country'
on_delete = kwargs.pop('on_delete',None) or models.PROTECT
related_name = kwargs.pop('related_name', None) or '+'
super().__init__(
to,
on_delete,
related_name=related_name,
related_query_name=None,
limit_choices_to=None,
parent_link=False,
to_field=None,
db_constraint=True,
**kwargs
)
def deconstruct(self):
kwargs = super().deconstruct()
del kwargs['to']
del kwargs['related_query_name']
del kwargs['limit_choices_to']
del kwargs['parent_link']
del kwargs['to_field']
del kwargs['db_constraint']
return kwargs
Вам нужно будет сделать новые миграции, где задействован RsftCountryField.