Python __init_;()获取了意外的关键字参数

Python __init_;()获取了意外的关键字参数,python,mongodb,python-2.7,django-models,Python,Mongodb,Python 2.7,Django Models,我正在尝试构建一个web服务,但我仍然坚持使用我的模型。我制作了一个模型“User”,它有一个ListField()作为照片,“Photo”是一个嵌入式文档。但在保存此用户对象时,我得到一个错误: Traceback (most recent call last): File "E:\Challenge\trial\services\workspace\Service\src\appservices\trial.py", line 7, in <module> likedB

我正在尝试构建一个web服务,但我仍然坚持使用我的模型。我制作了一个模型“User”,它有一个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'
我试图保存用户对象的方式是:

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

在我看来,这只不过是一个普通的Python问题。您已经从EmbeddedModelField中进行了子类化,但尚未覆盖子类中的init方法。因此,当您实例化提供特定于您的子类的参数的类时,这些参数将直接反馈给基类的init,然后基类将被抛出

只要看一眼Django文档,您就会想重写init,处理特定于类的arg/kwarg,并将任何通用/通用参数传递给基类(下面示例中的文档片段)

我不是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,这样它很容易识别 作为字段子类。)它的行为与任何现有字段都不一样,因此 我们将直接从字段中创建子类:


尝试删除代码“likedBy=ListField()”,它不会工作。我已经尝试过了。这没有帮助。请你帮我看一下上面的例子,因为我试着按照你的建议去做,但没有效果。编辑后根据你提供的代码添加了一个例子。除非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
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)