Min*_*nnR 5 python django overriding field model
我正在尝试创建一个自定义外键。我继承了它并尝试重写__init__方法来提供位置参数to,on_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()
Run Code Online (Sandbox Code Playgroud)
当我运行时它给我以下错误makemigrations:
TypeError: __init__() got multiple values for argument 'on_delete'
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄清楚问题是什么。我只为两个位置参数提供两个值。
假设如果您在所有者字段本身中传递User和参数,您可以看到 Django 如何转换其参数。on delete
例子
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()
Run Code Online (Sandbox Code Playgroud)
输出
<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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,Django 正在将auth.User和分别转换为带有键和 的models.CASCADE字典。IE,。toon_delete{'to': 'auth.User', 'on_delete': <function CASCADE at 0x103900400>}
因此,在您的情况下,您应该设置键的默认值to并on_delete获得预期的行为。
IE,
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
998 次 |
| 最近记录: |