模型中的TypeError

时间:2019-06-08 11:18:45

标签: python django django-models

我收到此错误:

user = models.OneToOneField(User) TypeError: init ()缺少1个必需的位置参数:'on_delete'

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

# Create your models here.

class UserProfileInfo(models.Model):

    # creating relationship
    user = models.OneToOneField(User)

    # additional attributes
    portfolio = models.URLField(blank=True)
    picture = models.ImageField(upload_to='profile_pics', blank=True)

    def __str__(self):
        return self.user.username

3 个答案:

答案 0 :(得分:1)

如错误所示,如果您引用的对象已被on_delete= parameter [Django-doc]删除,则需要指定应该发生的情况。例如:

class UserProfileInfo(models.Model):

    # creating relationship
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    # additional attributes
    portfolio = models.URLField(blank=True)
    picture = models.ImageField(upload_to='profile_pics', blank=True)

    def __str__(self):
        return self.user.username

这里的选项是:

  

CASCADE

     

级联删除。 Django模拟SQL约束的行为   ON DELETE CASCADE,并删除包含   ForeignKey

     相关模型未调用

Model.delete(),但pre_delete   和post_delete信号发送给所有已删除的对象。

     

PROTECT

     

通过引发ProtectedError来防止引用对象的删除,   django.db.IntegrityError的子类。

     

SET_NULL

     

设置ForeignKey为null;仅当nullTrue时才有可能。

     

SET_DEFAULT

     

ForeignKey设置为其default的值;默认的   必须设置ForeignKey

     

SET()

     

ForeignKey设置为传递给SET()的值,或者将其设置为   被传入,调用它的结果。在大多数情况下,通过   为了避免在您执行查询时执行查询,必须调用callable   models.py已导入(...)

     

DO_NOTHING

     

不采取任何措施。如果您的数据库后端强制引用   完整性,除非您手动添加,否则将导致IntegrityError   对数据库字段的SQL ON DELETE约束。

答案 1 :(得分:1)

这里有一个类似的问题Getting TypeError: __init__() missing 1 required positional argument: 'on_delete' when trying to add parent table after child table with entries

基本上遵循以下步骤可以解决网址问题

从Django 2.0开始,需要on_delete:

user = models.OneToOneField(User, on_delete=models.CASCADE)

答案 2 :(得分:1)

在构造函数中输入“ on_delete = models.CASCADE”

它的作用:何时删除您在模型的用户字段中引用的用户对象。还将删除特定用户的UserProfileInfo模型对象。