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

时间:2015-04-03 07:30:59

标签: python mongodb python-2.7 django-models

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

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 = 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()

1 个答案:

答案 0 :(得分:2)

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

快速浏览Django文档,您需要覆盖 init 并处理特定于类的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
  

编写字段子类¶

     

在规划Field子类时,首先要考虑哪些   现有的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)