【问题标题】:Cannot resolve keyword 'id' into field. Choices are: complete, task_priority, text, user, user_id无法将关键字“id”解析为字段。选项有:完成、task_priority、text、user、user_id
【发布时间】:2019-09-08 16:43:21
【问题描述】:

我正在处理一个 Todo 列表,该列表有不同的用户和他们自己的列表。 最初我的models.py为:

from django.db import models
from django.contrib.auth.models import User



class Todo(models.Model):
    text = models.CharField(max_length=40, default='Test User')
    complete = models.BooleanField(default = False)
    task_priority = models.CharField(max_length=40, default='high')
    def __str__(self):
        return self.text

但是当我试图将单个用户与其自己的一组待办事项(文本字段)及其优先级和状态联系起来时。

我这样添加一对一字段:

from django.db import models
from django.contrib.auth.models import User



class Todo(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key='user_id') #new
    text = models.CharField(max_length=40, default='Test User')
    complete = models.BooleanField(default = False)
    task_priority = models.CharField(max_length=40, default='high')
    def __str__(self):
        return self.text

它抛出了这样的错误:

字段错误在 / 无法将关键字“id”解析为字段。选项有:完成、task_priority、text、user、user_id

我没有完全理解一对一字段的概念,并且查看在线教程我很困惑天气我需要制作另一个表并将其链接到 Todo 表或添加另一个带有一些主键的字段?

帮助我理解这个概念。 提前致谢。

编辑: views.py 文件:

from django.shortcuts import render, redirect
from .models import Todo
from .form import TodoForm,ContactForm
import datetime 
from django.conf import settings
from django.utils import timezone
from django.views.decorators.http import require_POST
from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect
import json



def index(request):
    todo_list = Todo.objects.order_by('id')
    form = TodoForm()
    mydate = datetime.datetime.now()

    context = {'todo_list': todo_list, 'form': form, 'mydate':mydate}

    return render(request,'todo/index.html',context)

def login(request):
    return render(request, 'todo/login.html')


@require_POST
def addTodo(request):
    form = TodoForm(request.POST)
    text_input = form.get_cleaned_data['text']
    priority_input = form.get_cleaned_data['task_priority']
    if form.is_valid():
        new_todo = Todo(text = text_input, task_priority = priority_input)
        # new_todo = Todo(text = request.POST['text'])
        new_todo.save()
    return redirect('index')

def completeTodo(request, todo_id):
    todo = Todo.objects.get(pk=todo_id)
    todo.complete = True
    todo.save()

    return redirect('index')

def deleteCompleted(request):
    Todo.objects.filter(complete__exact=True).delete()

    return redirect('index')

def deleteAll(request):
    Todo.objects.all().delete()

    return redirect('index')


def emailView(request):

    todo = Todo.objects.all();
    task_list = []
    status_list = []
    for item in todo:
        stritem=str(item)
        task_list.append(stritem)
        if item.complete == True:
            status_list.append('complete')
        else:
            status_list.append('incomplete')


    if request.method == 'GET':
        form = ContactForm()
    else:
        form = ContactForm(request.POST)
        if form.is_valid():

            from_email = form.cleaned_data['from_email']
            message = form.cleaned_data['message']
            #maillist = Todo.objects.all()
            email_list=dict(zip(task_list,status_list))
            strlist = json.dumps(email_list)
            content = message + strlist
            try:
                send_mail('Todo List', content ,settings.EMAIL_HOST_USER,[from_email])
            except BadHeaderError:
                return HttpResponse('Invalid header found.')
            return redirect('success')
    return render(request, "email.html", {'form': form})

def successView(request):
    return HttpResponse('Success! Thank you for your message.')

新模型.py

from django.db import models
from django.contrib.auth.models import User



class Todo(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    text = models.CharField(max_length=40, default="")
    complete = models.BooleanField(default = False)
    task_priority = models.CharField(max_length=40, default='high')
    def __str__(self):
        return self.text

遇到

IntegrityError at /add NOT NULL 约束失败:todo_todo.user_id

【问题讨论】:

  • 您能否发布指向 '/' 的视图,如您的 url 中所述,以及视图正在呈现的模板?
  • 如果你的情况是单身可以有多个待办事项,那么使用ForeignKey而不是OneToOneField。和primary_key=True
  • 出错的可能性可能是您使用Todo.objects.get('id') 来获取 Todo 对象的 id。所以如果你在这里发表你的观点会更容易。

标签: python django


【解决方案1】:

这个:

user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key='user_id')

根本没有做你认为的那样。 primary_key 需要一个布尔值,而不是字段名称,并且与关系根本无关。因为字符串'user_id' 不为空,所以这被解释为True,相当于:

user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)

这意味着user 现在是 Todo 模型的主键。这不是你想要的。

删除 primary_key 子句。

【讨论】:

  • 在将 pk 用作“user_id”之前,我确实将其用作布尔值。我又试了一次,遇到了同样的错误。我也用 views.py 文件更新了这个问题来看看。
  • 您需要完全删除primary_key,然后迁移。在您删除它之前,Todo 不会有 id 字段。
  • 对不起,这可能是一个愚蠢的问题,但我们如何删除它?我应该删除表并再次进行迁移吗?
  • 通常进行迁移就足够了,但由于您有效地添加了主键,它会变得复杂。如果您没有任何您关心的数据,最好删除数据库并重新开始。
  • 我放下桌子,把所有东西都打扫干净了。进行了新的迁移,但仍然显示相同的错误。它甚至指向之前没有发生的 index.html。我在问题中添加了一张图片。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2019-10-16
  • 2012-09-13
  • 2013-04-09
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多