Пользовательское поле - получено несколько значений для аргумента ключевого слова '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.

Вернуться на верх