Python 如何从ForeignKey继承以扩展模型字段?

Python 如何从ForeignKey继承以扩展模型字段?,python,django,model,overriding,field,Python,Django,Model,Overriding,Field,我正在尝试创建一个自定义外键。我继承了它,并尝试重写\uuuuu init\uuuu方法,以提供位置参数到和关于_delete,如下所示: from django.contrib.auth.models import User class CurrentUserField(models.ForeignKey): def __init__(self, **kwargs): super().__init__(User, models.CASCADE, **kwargs)

我正在尝试创建一个自定义外键。我继承了它,并尝试重写
\uuuuu init\uuuu
方法,以提供位置参数
关于_delete
,如下所示:

from django.contrib.auth.models import User

class CurrentUserField(models.ForeignKey):
    def __init__(self, **kwargs):
        super().__init__(User, models.CASCADE, **kwargs)


class DemoModel(models.Model):
    owner = CurrentUserField()
    info = models.TextField()
当我运行
makemigrations
时,会出现以下错误:

TypeError: __init__() got multiple values for argument 'on_delete'

我似乎不明白问题出在哪里。我只为两个位置参数提供了两个值。

假设您在所有者字段本身中传递
User
on delete
参数,您可以看到Django如何转换其参数

范例

from django.db import models
from django.contrib.auth.models import User


class CurrentUserField(models.ForeignKey):
    def __init__(self, *args, **kwargs):
        for i in args:
            print(i, "This is an argument")

        for j in kwargs.items():
            print(j, "This is a keyword argument")
        super().__init__(*args, **kwargs)


class DemoModel(models.Model):
    owner = CurrentUserField(User, on_delete=models.CASCADE)
    info = models.TextField()
输出

<class 'django.contrib.auth.models.User'> This is an argument
('on_delete', <function CASCADE at 0x103900400>) This is a keyword argument
('on_delete', <function CASCADE at 0x103900400>) This is a keyword argument
('to', 'auth.User') This is a keyword argument
('on_delete', <function CASCADE at 0x103900400>) This is a keyword argument
('to', 'auth.User') This is a keyword argument

您使用的是哪个版本的Django?我使用的是Django 2.0汉克斯。这起作用了。是否有其他方法可以设置参数的默认值?或者我总是必须使用
setdefault
?我认为
kwargs.setdefault
可能是更好的选择。
from django.db import models
from django.contrib.auth.models import User


class CurrentUserField(models.ForeignKey):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('to', User)
        kwargs.setdefault('on_delete', models.CASCADE)
        super().__init__(*args, **kwargs)


class DemoModel(models.Model):
    owner = CurrentUserField()
    info = models.TextField()