Python 从Django 1.4迁移到Django 1.5后创建ODObject时出现问题
更新django版本后,我的测试没有成功 错误回溯看起来像Python 从Django 1.4迁移到Django 1.5后创建ODObject时出现问题,python,django,Python,Django,更新django版本后,我的测试没有成功 错误回溯看起来像 ERROR:mobile.tokenapi.http:: Traceback (most recent call last): File "/home/y700/projects/otipo-upd/otipo/as_site/apps/mobile/decorators.py", line 12, in wrapped response = func(*args, **kwargs) File "/home/y700/
ERROR:mobile.tokenapi.http:: Traceback (most recent call last):
File "/home/y700/projects/otipo-upd/otipo/as_site/apps/mobile/decorators.py", line 12, in wrapped
response = func(*args, **kwargs)
File "/home/y700/projects/otipo-upd/otipo/as_site/apps/assignation/assignmentstats/views.py", line 75, in settings
rate_settings = serializer.save(data, uws)
File "/home/y700/projects/otipo-upd/otipo/as_site/apps/assignation/assignmentstats/serializers.py", line 75, in save
settings = HourRateSettings.objects.get_or_create(user_settings=uws)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/models/manager.py", line 146, in get_or_create
return self.get_query_set().get_or_create(**kwargs)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/models/query.py", line 501, in get_or_create
six.reraise(*exc_info)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/models/query.py", line 491, in get_or_create
obj.save(force_insert=True, using=self.db)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/models/base.py", line 546, in save
force_update=force_update, update_fields=update_fields)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/models/base.py", line 650, in save_base
result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/models/manager.py", line 215, in _insert
return insert_query(self.model, objs, fields, **kwargs)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/models/query.py", line 1675, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 943, in execute_sql
cursor.execute(sql, params)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 127, in execute
six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 120, in execute
return self.cursor.execute(query, args)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 209, in execute
res = self._query(query)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 315, in _query
db.query(q)
File "/home/y700/Env/otipo_upd/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 226, in query
_mysql.connection.query(self, query)
IntegrityError: (1048, "Column 'rate' cannot be null")
由于某些原因,rate字段值不会传递给新实例创建函数
创建功能
@token_required
@mobile_response
def settings(request, workspace_id):
uws = get_object_or_404(UserWorkspaceSettings, workspace_id=workspace_id, user=request.user)
serializer = RateSettingsSerializer()
if request.method == 'POST':
data = json.loads(request.POST.get('data'))
form = RateSettingsForm(data=data)
hour_forms = [
HourTypeSettingsForm(data=type_rate, workspace=uws.workspace)
for type_rate in data.get('type_rates', [])]
if form.is_valid() and all([f.is_valid() for f in hour_forms]):
rate_settings = serializer.save(data, uws)
return serializer.item(rate_settings)
else:
errors = [dict(form.errors.items())] + [dict(f.errors.items()) for f in hour_forms]
return {'success': False, 'errors': errors}
if not hasattr(uws, 'hour_rate_settings'):
raise Http404
return serializer.item(uws.hour_rate_settings)
url.py
url(r'^user-settings/(?P<workspace_id>\d+)/rates/$', 'settings', name='assignmentstats_rate_settings'),
class RateSettingsSerializer(object):
def item(self, settings):
return {
'rate': settings.rate,
'type_rates': [{
'hour_type': hour_type.hour_type.id,
'rate': hour_type.rate,
} for hour_type in settings.type_settings.all()]
}
def save(self, data, uws):
settings = HourRateSettings.objects.get_or_create(user_settings=uws)
if hasattr(uws, 'hour_rate_settings'):
settings = uws.hour_rate_settings
settings.rate = data.get('rate')
settings.save()
for type_rate in data.get('type_rates', []):
hrs = get_object_or_None(
HourTypeSettings, rate_settings=settings, hour_type_id=type_rate.get('hour_type'))
if hrs is None:
hrs = HourTypeSettings(rate_settings=settings, hour_type_id=type_rate.get('hour_type'))
hrs.rate = type_rate.get('rate')
hrs.save()
return settings
class HourRateSettings(models.Model):
user_settings = models.OneToOneField(
'assignation.UserWorkspaceSettings', related_name='hour_rate_settings')
rate = models.PositiveSmallIntegerField()
我阅读了Django 1.5发行说明,但没有看到问题所在。在django 1.4上,此代码正常工作
UPD
型号.py
url(r'^user-settings/(?P<workspace_id>\d+)/rates/$', 'settings', name='assignmentstats_rate_settings'),
class RateSettingsSerializer(object):
def item(self, settings):
return {
'rate': settings.rate,
'type_rates': [{
'hour_type': hour_type.hour_type.id,
'rate': hour_type.rate,
} for hour_type in settings.type_settings.all()]
}
def save(self, data, uws):
settings = HourRateSettings.objects.get_or_create(user_settings=uws)
if hasattr(uws, 'hour_rate_settings'):
settings = uws.hour_rate_settings
settings.rate = data.get('rate')
settings.save()
for type_rate in data.get('type_rates', []):
hrs = get_object_or_None(
HourTypeSettings, rate_settings=settings, hour_type_id=type_rate.get('hour_type'))
if hrs is None:
hrs = HourTypeSettings(rate_settings=settings, hour_type_id=type_rate.get('hour_type'))
hrs.rate = type_rate.get('rate')
hrs.save()
return settings
class HourRateSettings(models.Model):
user_settings = models.OneToOneField(
'assignation.UserWorkspaceSettings', related_name='hour_rate_settings')
rate = models.PositiveSmallIntegerField()
您可以将模型类放在这里吗?完成,是的,我知道我可以添加
null=True
,但这不是解决方案。我还查看了发行说明,但他们可能忽略了null
字段参数的轻微默认值更改。也许我们必须检查源代码的更改。然而,这并不是一个微小的改变。即使在Django 1.4中,HourRateSettings.objects.get_或_create(user_settings=uws)也会返回一个对象的元组和一个“created”布尔值,所以代码似乎是错误的。@RemcoGerlich是的。看起来这是条线。我会处理的,谢谢!