Python 从Django 1.4迁移到Django 1.5后创建ODObject时出现问题

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/

更新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/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是的。看起来这是条线。我会处理的,谢谢!