TypeError:ModelBase对象获得了关键字参数的多个值

时间:2013-03-20 14:43:27

标签: python django unit-testing

我正在接受

  

TypeError:ModelBase对象获得了关键字参数的多个值   '日期'

当我尝试创建一个“城市”时,在我的测试框架上


这是我的追溯:

ERROR: test_create_city (app.tests.AppManagementTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "..tests.py", line 158, in test_create_city
    city_obj = City(user = self.user, category = c, date = datetime.datetime.now(), **data)
TypeError: ModelBase object got multiple values for keyword argument 'date'

和我的代码:

def test_create_city(self):
c = Category(name=self.categories[0]['name'])
c.save()
data = {'vehiclesound': '/assets/sounds/vehicle.ogg', 'vehicleshadow': '', 'maxspeed': 160.0, 'suspensionrestlength': 0.5, 'category': 12L, 'leftpub': '8294092164', 'wheelmodelzscale': 0.7, 'camheight': 2.1, 'speedminturn': 50.0, 'suspensiondeltatime': 0.25, 'crashsound': '/assets/sounds/crash.ogg', 'decel': 40.0, 'camtilt': 90.0, 'turnspeedmin': 20.0, 'path': 'just_testing_path', 'frontrightwheel': '', 'limitlinealpha': '01', 'open': 1, 'id': 35L, 'limitheight': 700L, 'modelzscale': 0.7, 'model_complete': 'http://youbeq.org/models/get.php?file=default_app/model.dae', 'rearleftwheel': '', 'user_id': 1L, 'wheelmodelyscale': 0.7, 'allwheels': 'http://sketchup.google.com/3dwarehouse/download?mid=4bc3b6056f5cd97eb5d8f6f0e9fb0ac&rtyp=ks&fn=taxi_4tires&ctyp=other&prevstart=0&ts=1343322996000', 'limitlinecolor': 'FFFFFF', 'limitcolor': '00ffff', 'gravity': 70.0, 'modelxscale': 0.7, 'limitlinewidth': 2L, 'kms': 9007.25, 'axisdistance': 2.5, 'minaccelstep': 5.0, 'wheelsdistance': 1.0, 'limitalpha': '70', 'turnspeedmax': 60.0, 'traildistance': 10.0, 'suspensionstiffness': 0.5, 'vehicletype': 'car', 'description': 'The City that never sleeps', 'wheelsheight': 0.37, 'vehiclesoundtime': 150.0, 'rollclamp': 50.0, 'accel': 5.0, 'backgroundsoundtime': 150.0, 'wheelmodelxscale': 0.7, 'rightpub': '5607834847', 'key': 'just_testing_key', 'accelstep': 25.0, 'date': None, 'world': 'earth', 'mapiconurl': '', 'vehicleagility': 0.0005, 'footer_large': '/assets/img/new_york.png', 'modelheight': 0.0, 'frontleftwheel': '', 'speedmaxturn': 5.0, 'name': 'New York', 'footer': '/taxi/assets/img/taxi_smarturbia_image_new_york.png', 'suspensiondamping': -0.15, 'rearrightwheel': '', 'crashsoundtime': 150.0, 'vehiclefastsoundtime': 150.0, 'maxrevspeed': 15.0, 'mass': 3000.0, 'backgroundsound': '/assets/sounds/background.ogg', 'published': 1, 'modelyscale': 0.7, 'model': 'http://sketchup.google.com/3dwarehouse/download?mid=128bf1862f1eb56db5d8f6f0e9fb0ac&rtyp=ks&fn=taxi_new_york_chassi&ctyp=other&prevstart=12&ts=1343297355000', 'vehiclefastsound': '', 'rollspring': 0.5, 'steerroll': -1.0}
        print self.user
        try :
            city_obj = City.objects.get(key=self.categories[0]['name'])
            print ("city_already_exists")
        except City.DoesNotExist:
            print ("debug")
            city_obj = City(user = self.user, category = c, date = datetime.datetime.now(), **data)
            city_obj.save()

2 个答案:

答案 0 :(得分:2)

在Python中,您可以传递哈希并使用**来代替关键字参数。考虑这个例子:

>>> def fun(x, y):
...   pass
... 
>>> hash = {'x': 1, 'y': 2}
>>> fun(**hash) # OK
>>> fun(x=3, **hash) # x defined both explicitly and in hash
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fun() got multiple values for keyword argument 'x'

在您的情况下,City构造函数使用date两次:'date': None哈希中有data,并City明确传递给date = datetime.datetime.now() }。

要修复此代码,您应该从date哈希中删除data,这样它就不会与显式参数冲突。

答案 1 :(得分:1)

您的data字典包含'date': None,因此错误显示,您将两次传递日期,因为您还在关键字参数中明确传递了它。

你可能想做这样的事情:

new_data = {'user': self.user, 'category': c, 'date': datetime.datetime.now()}
data.update(new_data)
city_obj = City(**data)

(注意这会修改data字典,如果你不想这样,那么你应该先复制它。)