【问题标题】:Django/python: (1048, "Column 'date' cannot be null")Django/python:(1048,“列'日期'不能为空”)
【发布时间】:2016-12-14 18:12:16
【问题描述】:

我创建了一个 Django 项目,其中类型 1 用户可以创建帖子,类型 2 用户可以对 post_queryset = Post.objects.filter(accepted=False) 中的帖子出价。最后,post_owner 可以接受出价。接受后,我想从 post_queryset 中删除接受的对象。因此,我创建了一个视图(accept_bid),其中类型 1 用户可以接受出价,同时它通过 BooleanField(accepted) = True。这样,帖子将不再出现在 post_list 页面中。但是当我保存 accept_bid 实例时,它会引发 IntegrityError: (1048, "Column 'date' cannot be null")。我不确定我在我看来更改 BooleanField() = True 的方法是否正确。我将不胜感激帮助我解决这个问题。

这是我的代码:

模型.py:

class Post(models.Model):

    item = models.CharField(max_length=20)
    post_owner = models.OneToOneField(settings.AUTH_USER_MODEL, default=1)
    date = models.DateField()
    accepted = models.BooleanField(default = False)


class Bid(models.Model):

    post = models.ForeignKey(Post, related_name = bids)
    amount = models.IntegerField(max_length = 20)
    bidder = models.ForeingKey(settings.AUTH_USER_MODEL)

class Auction(models.Model):

    post = models.OneToOneField(Post)
    post_owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
    bid = models.OneToOneField('truck.Bid', related_name='auctions')

forms.py:

class AcceptedForm(forms.ModelForm):
accepted = forms.BooleanField(required=False)

    class Meta:
        model = Post
        fields = ('accepted', )

views.py:

def accept_bid(request, post_id, bid_id):

    post = get_object_or_404(Post, id=post_id)
    bid = get_object_or_404(Bid, id=bid_id)
    if request.method=='POST':
        form = AuctionForm(request.POST or None)
        form1 = AcceptedForm(request.POST)
        if form.is_valid() and form1.is_valid():
            accept_bid = form.save(commit=False)
            accept_bid.bid = bid
            accept_bid.post = post
            accept_bid.post_owner = request.user
            accepted = form1.save()
            accepted.accepted = True
            accept_bid.save()

            form.save()
            form1.save()
    else:
        form = AuctionForm()
        form1 = AcceptedForm()

    context = {

            "bid_id" : bid_id,
            "post_id" : post_id,
            "bid": bid,
            "post":post,
            'form': form
            'form1': form1,

         }
     return render(request, 'loggedin_load/active_deals.html', context)

追溯:

Traceback:

File "c:\python34\lib\site-packages\django\db\backends\mysql\base.py" in execute
  112.             return self.cursor.execute(query, args)

File "c:\python34\lib\site-packages\MySQLdb\cursors.py" in execute
  226.             self.errorhandler(self, exc, value)

File "c:\python34\lib\site-packages\MySQLdb\connections.py" in defaulterrorhandler
  36.         raise errorvalue

File "c:\python34\lib\site-packages\MySQLdb\cursors.py" in execute
  217.             res = self._query(query)

File "c:\python34\lib\site-packages\MySQLdb\cursors.py" in _query
  378.         rowcount = self._do_query(q)

File "c:\python34\lib\site-packages\MySQLdb\cursors.py" in _do_query
  341.         db.query(q)

 File "c:\python34\lib\site-packages\MySQLdb\connections.py" in query
   280.             _mysql.connection.query(self, query)

 During handling of the above exception ((1048, "Column 'date' cannot be null")), another exception occurred:

File "c:\python34\lib\site-packages\django\core\handlers\base.py" in  get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "c:\python34\lib\site-packages\django\core\handlers\base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "c:\python34\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "c:\python34\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "C:\Users\sumanth\Desktop\django-custom-user-master\search field\Project\mysite\personal\views.py" in accept_bid
  447.          accepted = form1.save()

File "c:\python34\lib\site-packages\django\forms\models.py" in save
  451.             self.instance.save()

File "c:\python34\lib\site-packages\django\db\models\base.py" in save
  708.                        force_update=force_update, update_fields=update_fields)

File "c:\python34\lib\site-packages\django\db\models\base.py" in save_base
  736.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)

File "c:\python34\lib\site-packages\django\db\models\base.py" in _save_table
  820.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

File "c:\python34\lib\site-packages\django\db\models\base.py" in _do_insert
  859.                                using=using, raw=raw)

File "c:\python34\lib\site-packages\django\db\models\manager.py" in manager_method
  122.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "c:\python34\lib\site-packages\django\db\models\query.py" in _insert
  1039.         return query.get_compiler(using=using).execute_sql(return_id)

File "c:\python34\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql
  1060.                 cursor.execute(sql, params)

File "c:\python34\lib\site-packages\django\db\backends\utils.py" in execute
  79.             return super(CursorDebugWrapper, self).execute(sql, params)

File "c:\python34\lib\site-packages\django\db\backends\utils.py" in execute
  64.                 return self.cursor.execute(sql, params)

File "c:\python34\lib\site-packages\django\db\backends\mysql\base.py" in execute
 117.                 six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])

File "c:\python34\lib\site-packages\django\utils\six.py" in reraise
  685.             raise value.with_traceback(tb)

File "c:\python34\lib\site-packages\django\db\backends\mysql\base.py" in execute
  112.             return self.cursor.execute(query, args)

File "c:\python34\lib\site-packages\MySQLdb\cursors.py" in execute
  226.             self.errorhandler(self, exc, value)

File "c:\python34\lib\site-packages\MySQLdb\connections.py" in defaulterrorhandler
  36.         raise errorvalue

File "c:\python34\lib\site-packages\MySQLdb\cursors.py" in execute
  217.             res = self._query(query)

File "c:\python34\lib\site-packages\MySQLdb\cursors.py" in _query
  378.         rowcount = self._do_query(q)

File "c:\python34\lib\site-packages\MySQLdb\cursors.py" in _do_query
  341.         db.query(q)

File "c:\python34\lib\site-packages\MySQLdb\connections.py" in query
  280.             _mysql.connection.query(self, query)

Exception Type: IntegrityError at /post/3/bid/7/
Exception Value: (1048, "Column 'date' cannot be null")

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    当您尝试保存 form1 而不是保存 accept_bid 实例时会出现错误:

    File "C:\Users\sumanth\Desktop\django-custom-user-master\search field\Project\mysite\personal\views.py" in accept_bid
      447.          accepted = form1.save()
    

    form1 是基于您的 Post 模型的 ModelForm。由于您的 Post 模型已经具有 accepted 属性,因此您不必像在此处那样手动为它定义一个字段 - 在您所做的表单的 Meta 定义中包括该字段就足够了.

    你需要从那里做三件事之一:

    1. 还要在您的 ModelForm 中包含 date 字段,以便提交者设置,

    2. 将模型设置为自动包含创建日期 (auto_now_add=True),或允许该字段为空白。或者,

    3. 使用commit=False 中断保存并向您的对象添加日期:

      accepted = form1.save(commit=False)
      accepted.date = ...
      accepted.save()
      

    还要注意这里:

    accepted = form1.save()
    accepted.accepted = True
    

    您将accepted 保存到数据库中,然后在本地更新对象。第二行只更新内存中的对象,而不是数据库。如果您使用print accepted.accepted,它确实会显示为True,但如果您从数据库中重新获取对象然后再次尝试,它将显示为False,因为该更改从未保存到数据库中。

    【讨论】:

    • 实际上是为交货目的设置日期字段。所以我无法进入 auto_now_add。如何从 Post 对象中获取现有的日期值并将其设置在我的视图中。我确实接受了.date = post.date。但它不起作用。谢谢。
    • 当你说它不工作时,你到底是什么意思? post.date 不等于您期望的值吗?还是您收到新的错误消息?还是再次出现同样的错误?
    • 确保您首先设置accepted = form1.save(commit=False),然后设置accepted.date = post.date,最后设置accepted.save()。听起来您在设置该日期属性之前正在做一个没有commit=Falsesave()。如果我错了,您能否在更新后的视图中发布表单处理?
    • @souldex,我又遇到了一个新问题。接受的值不会转到现有的帖子对象。在我的数据库中,它创建了一个新对象,其中存在日期字段和其他字段为空。你能再一次帮助我如何更新现有的对象吗?可能是我缺少将 post_id 传递给更新的视图。
    • 我不确定我是否遵循;现在 form1 设置为创建一个新的 Post 对象。您是否希望它编辑现有的 Post 对象?如果是这样,您将希望在实例化并使用instance 关键字(分别为form1 = AcceptedForm(instance=...)form1 = AcceptedForm(request.POST, instance=...))进行处理时将要编辑的对象传递给表单。如果我有误解,请随时通过我的网站 souldeux.com 私信我,因为我们的评论对话在这里有点长。
    猜你喜欢
    • 2018-01-06
    • 2016-09-06
    • 2018-10-13
    • 2016-02-24
    • 1970-01-01
    • 2021-09-03
    • 2020-06-12
    • 1970-01-01
    • 2023-02-22
    相关资源
    最近更新 更多