【问题标题】:__init__() got an unexpected keyword argument__init__() 得到了一个意外的关键字参数
【发布时间】:2015-06-08 07:13:26
【问题描述】:

我正在尝试构建 Web 服务,但我的模型卡住了。我制作了一个模型“用户”,它有一个 ListField() 作为照片,“照片”是一个嵌入式文档。但是在保存这个用户对象时,我得到一个错误:

Traceback (most recent call last):
File "E:\Challenge\trial\services\workspace\Service\src\appservices\trial.py", 
  line 7, in <module>
  likedBy=["Name1", "Name2", "Name3", "Name4"]))
File "E:\Challenge\trial\Python27\lib\site-packages\djangotoolbox\fields.py", 
    line 253, in __init__
    super(EmbeddedModelField, self).__init__(*args, **kwargs)
    TypeError: __init__() got an unexpected keyword argument 'likedBy'

下面是我的模型文件:

from django.db import models
from djangotoolbox.fields import ListField, EmbeddedModelField

class User(models.Model):
    username = models.CharField(max_length=100, blank=False, unique = True)
    fname = models.CharField(max_length=100, blank=False)
    lname = models.CharField(max_length=100, blank=True)
    photos = ListField()        #embedded list of photos uploaded by users
    created = models.DateTimeField(auto_now_add=True)    

    def __unicode__(self):
        return self.name

class Photo(EmbeddedModelField):
    description = models.TextField()
    link = models.TextField()
    like = models.IntegerField
    likedBy = ListField()

    def __unicode__(self):
        return self.name

我试图保存用户对象的方式是:

user = User(username="username", fname="Harshal", lname="Tripathi")
user.photos.append(Photo(description="This is a great photo uploaded for trial", link="http://image.com/images/user_photo.jpg", like="365", likedBy=["Name1", "Name2", "Name3", "Name4"]))
user.save()

【问题讨论】:

  • 尝试删除代码“likedBy = ListField()”
  • 不行,我试过了。

标签: python mongodb python-2.7 django-models


【解决方案1】:

在我看来,这只不过是一个普通的 Python 问题。您已经从 EmbeddedModelField 子类化,但您没有覆盖子类中的 init 方法。因此,当您实例化提供特定于您的子类的参数的类时,这些参数会直接馈送到基类的 init,然后被轰炸出去。

在 Django 文档一目了然,你会想要覆盖 init 并处理你的类特定的 args/kwargs 并将任何通用/通用参数传递给基类(sn-p from以下示例下方的文档)。

我不是 Django 开发人员,没有时间安装和设置它,但是根据您上面提供的代码,我希望以下内容可以正常工作,除非 Django 有一些我不知道的固有特性在文档中一目了然。

from django.db import models
from djangotoolbox.fields import ListField, EmbeddedModelField

class User(models.Model):
    username = models.CharField(max_length=100, blank=False, unique = True)
    fname = models.CharField(max_length=100, blank=False)
    lname = models.CharField(max_length=100, blank=True)
    photos = ListField()        #embedded list of photos uploaded by users
    created = models.DateTimeField(auto_now_add=True)    

    def __unicode__(self):
        return self.name

class Photo(EmbeddedModelField):
    description = models.TextField()
    link = models.TextField()
    like = models.IntegerField
    likedBy = ListField()

    def __init__(self, link=None, like=None, likedBy=None, *args, **kwargs):
        super(Photo, self).__init__(*args, **kwargs)
        self.link = link or self.link
        self.like = like or self.like
        self.likedBy = likedBy or self.likedBy

    def __unicode__(self):
        return self.name

编写字段子类¶

在规划你的 Field 子类时,首先考虑一下哪个 您的新字段与现有字段类最相似。你可以吗 子类化现有的 Django 字段并为自己节省一些工作?如果不, 你应该继承 Field 类,一切都来自它 下降。

初始化你的新字段是分离任何 从常见论点中针对您的案例的论点和 将后者传递给 Field 的 __init__() 方法(或您的父母 类)。

在我们的示例中,我们将字段命名为 HandField。 (这是个好主意 调用您的 Field 子类 Field,因此很容易识别 作为一个 Field 子类。)它的行为不像任何现有的字段,所以 我们将直接从 Field 子类化:

from django.db import models

class HandField(models.Field):

    description = "A hand of cards (bridge style)"

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 104
        super(HandField, self).__init__(*args, **kwargs)

【讨论】:

  • 这没有帮助。请您帮忙看看我上面展示的示例,因为我尝试按照您的建议进行操作,但效果不佳。
  • 已编辑以根据您提供的代码添加示例。这应该可以正常工作,除非 Django 中有一些我不知道的古怪东西。
  • 谢谢。:) 虽然我已经改变了我的方法并且能够实现我想要的。我会给你你应得的时间和努力。 :)
猜你喜欢
  • 2021-03-17
  • 2013-05-05
  • 2016-06-05
  • 2020-08-20
  • 2021-09-20
  • 2014-05-12
  • 2021-12-30
  • 2021-03-18
  • 2015-04-29
相关资源
最近更新 更多