2015-04-03 3 views
1

Я пытаюсь создать веб-сервис, но я застрял с моими моделями. Я создал модель «Пользователь», и у нее есть ListField() в качестве фотографий, «Фото» - это встроенный документ. Но при сохранении этого пользователя объекта Я получаю сообщение об ошибке, как:__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

попробуйте удалить код "likesBy = ListField()" – flycee

+0

не работает Я попробовал. – HVT7

ответ

2

Это выглядит как не что иное, как обычная проблема с Python. Вы подклассифицированы из EmbeddedModelField, но вы не переопределили метод init в своем подклассе. В результате, когда вы создаете экземпляр этого класса, предоставляя аргументы, специфичные для вашего подкласса, они передаются непосредственно базовому классу init, который затем выгружается.

На первом взгляде на Django документах, вы хотите, чтобы переопределить инициализации и обрабатывать классовый арг/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¶

При планировании поля подкласса, первом поразмыслить, к которой существующему класс поля вашего новое поле, наиболее похожее на. Можете ли вы установить подклассу существующего поля Django и сэкономить себе некоторую работу? Если нет, , вы должны подклассифицировать класс Field, из которого все вышло .

Инициализации нового поля является вопросом выделения каких-либо аргументов, которые являются специфическими для вашего дела от общих аргументов и передавая последний метод __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

+0

Отредактировано для добавления примера на основе предоставленного вами кода. Это должно хорошо работать, если в Django нет чего-то странного, о котором я не знаю. – jbee

+0

Спасибо. :) Хотя я изменил свой подход и смог достичь того, чего хотел. Я дам вам то, что вы заслуживаете для своего времени и усилий. :) – HVT7

Смежные вопросы