完整性错误不能为空

时间:2014-03-07 17:18:35

标签: django python-2.7

我正在建立一个类似于易货网站的网站,但我们正在交换时间, 我有一个类Transaction,它接受“offer”值,从请求用户的余额中扣除该值,并将该值归功于Offer'r。

现在,当我点击模板中的“接受优惠”时,我收到此错误

ofertoj_transaction.accepted_by may not be NULL

堆栈跟踪:

IntegrityError at /oferto/accept/

环境:

Request Method: GET
Request URL: http://127.0.0.1:8000/oferto/accept/?offer_id=1&creator=2

Django Version: 1.5.4
Python Version: 2.7.4
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'django.contrib.comments',
 'django.contrib.sitemaps',
 'zinnia',
 'tagging',
 'mptt',
 'south',
 'registration',
 'blogs',
 'turtle',
 'ofertoj',
 'petoj',
 'x',
 'profiles')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/views/generic/base.py" in dispatch
  86.         return handler(request, *args, **kwargs)
File "/home/talisman/projects/tempilo/ofertoj/views.py" in get
  74.                   accepted_by=self.request.user.id
File "/home/talisman/projects/tempilo/ofertoj/models.py" in create
  59.       new_transaction.save()
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/base.py" in save
  546.                        force_update=force_update, update_fields=update_fields)
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/base.py" in save_base
  650.                 result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/manager.py" in _insert
  215.         return insert_query(self.model, objs, fields, **kwargs)
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/query.py" in insert_query
  1675.     return query.get_compiler(using=using).execute_sql(return_id)
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/sql/compiler.py" in execute_sql
  937.             cursor.execute(sql, params)
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/backends/util.py" in execute
  41.             return self.cursor.execute(sql, params)
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/backends/sqlite3/base.py" in execute
  364.             six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
File "/home/talisman/virt_env/tempilo/local/lib/python2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/backends/sqlite3/base.py" in execute
  362.             return Database.Cursor.execute(self, query, params)

Exception Type: IntegrityError at /oferto/accept/
Exception Value: ofertoj_transaction.accepted_by may not be NULL

ofertoj.views.py

的一部分
class TransactionView(TemplateView, LoginRequiredMixin):
    template_name = "ofertoj/offer_accepted.html"

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        if self.request.GET.get("offer_id"):
            oferto = Oferto.objects.get(id=self.request.GET.get("offer_id"))
            if oferto.valid:
                transaction = Transaction()
                transaction.create(
                    creator=self.request.GET.get("creator"),
                    amount=oferto.time,
                    accepted_by=self.request.user.id
                )
                acceptor = Profile.objects.get(user=self.request.user)
                acceptor.balance = acceptor.balance - oferto.time
                acceptor.save()

                # credit the coins to the creator
                creator = Profile.objects.get(user=oferto.user)
                creator.balance = creator.balance + oferto.time
                creator.save()
            else:
                return HttpResponse("This offer is already accepted")
        else:
            raise Http404

        return self.render_to_response(context)

Ofertoj.models的一部分

class Transaction(models.Model):
    creator = models.IntegerField()
    amount = models.IntegerField()
    accepted_by = models.IntegerField()

    def __unicode__(self):
        return self.id

    def create(self, **kwargs):
        new_transaction = Transaction(
                creator = kwargs['creator'],
                amount = kwargs['amount'],
                accepted_by = kwargs['accepted_by']
            )
        new_transaction.save()
        return

此行在stacktrace

中高亮显示
acceptor = Profile.objects.get(user=self.request.user)

ofertoj.urls

url(
    regex=r"^accept/$",
    view = TransactionView.as_view(),
    name = "accept_offer"
    ),

我的模板的一部分

{% if oferto.valid and not oferto.user == request.user %}
<a href="{% url "accept_offer" %}?offer_id={{ oferto.id }}&creator={{ oferto.user.id }}">Accept this Offer</a>
{% endif %}

<br /><br />

2 个答案:

答案 0 :(得分:0)

您的ofertoj应用程序正在尝试存储Transaction对象,该对象的accepted_by字段为NULL,但您的数据库架构不允许此字段为{{ 1}}。

检查此代码:

NULL

以及transaction.create( creator=self.request.GET.get("creator"), amount=oferto.time, accepted_by=self.request.user.id ) 的代码。

一种可能性:如果您的用户未登录,则transaction.create将为self.request.user.id,这将转换为数据库中的None。我的代码中没有看到任何需要用户登录的内容。

答案 1 :(得分:0)

这是Profile模型中 unicode 方法的问题 因此,余额默认为空