__init __()得到了一个意想不到的关键字参数

问题描述:

我试图构建一个Web服务,但我坚持使用我的模型。我制作了一个Model“User”,它有一个ListField()作为照片,“Photo”是一个嵌入式文档。不过,虽然这节省用户对象,我得到一个错误:__init __()得到了一个意想不到的关键字参数

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() 
+0

尝试删除代码“likedBy = ListField()” – flycee 2015-04-03 07:41:57

+0

它不会工作我试过了。 – HVT7 2015-04-03 09:13:24

这对我来说只不过是一个普通的Python问题。您已从EmbeddedModelField中继承,但您尚未覆盖子类中的init方法。因此,当您实例化提供了特定于您的子类的参数的类时,这些类将直接馈送到基类的init,然后它会被轰炸。

在在Django文档一目了然,你会想覆盖初始化和处理特定类ARGS/kwargs从文档传递任何通用/通用参数赋值给基类(代码段下面的示例如下)。

我不是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 

写场subclass¶

在规划领域的子类,首先考虑一下这 现有Field类新的领域是最相似的。您可以 继承现有的Django字段并保存一些工作吗?如果不是, 您应该继承字段类,其中所有内容均为 。

初始化新的字段是从公共参数分离出任何 参数特定于您的情况和 使后者字段(或父 类)的__init __()方法的问题。

在我们的示例中,我们将调用我们的字段HandField。 (这是对 打电话给你的现场子场一个好主意,所以它很容易识别 作为一个字段子类。)它不会表现得像任何现有的现场,所以 我们将从现场直接继承:

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) 
+0

这没有帮助。请你帮我解释一下我上面展示的例子,因为我试着按照你的建议做,而且没有什么好处。 – HVT7 2015-04-05 19:37:04

+0

根据您提供的代码编辑添加示例。这应该可以正常工作,除非Django中有些东西我不知道。 – jbee 2015-04-06 23:27:05

+0

谢谢。:) 虽然我改变了我的方法,并能够实现我想要的。我会给你你应得的时间和努力。 :) – HVT7 2015-04-07 07:22:42