自定义字段 - 关键字参数有多个值 'related_name'
Custom field - got multiple values for keyword argument 'related_name'
我正在开发一个自定义字段,它只是指向 addresses.Country
模型的 ForeignKey
的快捷方式。
当我 运行 makemigrations
它 returns 这个错误我不确定:
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()
method [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 <strong>deconstruct</strong>(self):
name, path, args, kwargs = super().deconstruct()
kwargs.pop('to', None)
kwargs.pop('related_query_name', None)
kwargs.pop('limit_choices_to', None)
kwargs.pop('parent_link', None)
kwargs.pop('to_field', None)
kwargs.pop('db_constraint', None)
return <strong>name, path, args, kwargs</strong>
您将需要在涉及 RsftCountryField
的地方进行新的迁移。
我正在开发一个自定义字段,它只是指向 addresses.Country
模型的 ForeignKey
的快捷方式。
当我 运行 makemigrations
它 returns 这个错误我不确定:
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()
method [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 <strong>deconstruct</strong>(self):
name, path, args, kwargs = super().deconstruct()
kwargs.pop('to', None)
kwargs.pop('related_query_name', None)
kwargs.pop('limit_choices_to', None)
kwargs.pop('parent_link', None)
kwargs.pop('to_field', None)
kwargs.pop('db_constraint', None)
return <strong>name, path, args, kwargs</strong>
您将需要在涉及 RsftCountryField
的地方进行新的迁移。