无法在 Django 中的 SQLlite3 数据库中插入 PSOT 数据 - NOT NULL 约束失败错误

问题描述 投票:0回答:1

我有一个包含 10 个问题和一个评论字段的页面。 问题的答案是通过单选按钮选择的,评论是一个文本字段。 当我尝试将 POST 数据输入到我的 SQL 数据库时,我收到错误:

NOT NULL constraint failed: ISO22301_answer.value

SQL 表有 3 个字段:

名称 - 从 LQ1 到 LQ10 的标识符

答案 - 0 - 5 之间的整数

问题 - 包含正在回答的问题文本的 FK。由于当我进行管理时,问题位于数据库中,因此它们显示为答案中的下拉菜单。

相关文件片段是:

模型.py

class Topic(models.Model):
    name = models.CharField(max_length=30)

    def __str__(self):
        return f"{self.name}"


class Question(models.Model):
    question = models.CharField(max_length=200)
    name = models.CharField(max_length=20)  # THis is probably useless

    topic = models.ForeignKey(
        Topic, on_delete=models.CASCADE
    )  # Django will store this as topic_id on database

class Answer(models.Model):
    value = models.IntegerField()
    name = models.CharField(max_length=20)
    # q_id = models.CharField(max_length=10, default="XX")  # USed foreignkey instead
    question = models.ForeignKey(
        Question, on_delete=models.CASCADE
    )


    def __str__(self):
        return f"{self.question} value is {self.value}"

leadership.html(10 行之一):

  <td colspan="7">Risk Assessment and Planning</td>
  <tr>
      <td class="question">Conducts annual risk assesments and identifies key risks and mitigation actions</td>
      <td>
        <input  name="LQ1" type="radio" value="1" id="LQ1_1" />1
      </td>
      <td>
        <input name="LQ1" type="radio" value="2" id="LQ1_2" />2
      </td>
      <td>
        <input name="LQ1" type="radio" value="3"  id="LQ1_3"/>3
      </td>
      <td>
        <input name="LQ1" type="radio" value="4"  id="LQ1_4"/>4
      </td>
      <td>
        <input name="LQ1" type="radio" value="5"  id="LQ1_5"/>5
    </td>
    <td>
      <input name="LQ1" type="radio" value="0"  id="LQ1_6"/>
    </td>
  </tr>

views.py:

def leadership(request):
    if request.method == "POST":
        results=dict(request.POST) # get POST data from form
        print("Post", results)
        name = request.POST.get('name')
        value =  request.POST.get('value')
        answer = Answer(name=name, value=value)
        answer.save()
        # everything belwo here is just to calculate a score and render an anser page with color coding based on score
        score_comments=create_list(results) #Get tuple with (score, comments)
        score=score_comments[0]
        comments=score_comments[1]
        question_answers = []
        question_answers =  score_comments[2]
        results_color = score_color(score)
        print(score, results_color,comments, question_answers)
        #answers(results)
        context = {
            "shade": results_color
        }
        return render(request, "leadershipresults.html", context)
    else:
        return render(request, "leadership.html")

POST 返回数据:


Variable        Value
csrfmiddlewaretoken 'mR6idvTRbovOc1V24ZcyJsosXaylGQx4SZ4f99BlAQ2gvJkwK7LfhxMJMYjr3bAo'
LQ1         '2'
LQ2         '2'
LQ3         '2'
LQ4         '2'
LQ5         '2'
LQ6         '2'
LQ7         '2'
LQ8         '2'
LQ9         '2'
LQ10            '2'
L_Text          'nmbvbncvbcxv'

SQL 表

ISO22301_answer             auth_user                 
ISO22301_area               auth_user_groups          
ISO22301_comment            auth_user_user_permissions
ISO22301_question           django_admin_log          
ISO22301_topic              django_content_type       
auth_group                  django_migrations         
auth_group_permissions      django_session            
auth_permission

sqlite> PRAGMA table_info(ISO22301_answer);
0|id|INTEGER|1||1
1|value|INTEGER|1||0
2|name|varchar(20)|1||0
3|question_id|bigint|1||0

我尝试从返回的 POST 数据中删除令牌和注释并执行 get() 操作,但这不起作用。

我使用 pop 和 del 来做到这一点。

我还尝试添加“blank=True, null=True”到

class Answer(models.Model):
    value = models.IntegerField()
    name = models.CharField(max_length=20)
    # q_id = models.CharField(max_length=10, default="XX")  # USed foreignkey instead
    question = models.ForeignKey(
        Question, on_delete=models.CASCADE, blank=True, null=True)

无济于事。

python django sqlite
1个回答
0
投票

您需要更改答案模型的值字段。

class Answer(models.Model):
    value = models.IntegerField()
=>
value = models.IntegerField(null=True)
OR
value = models.IntegerField(default=984354684)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.