2015-04-03 111 views
1

我試圖構建一個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

回答

2

這對我來說只不過是一個普通的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

相關問題