Не удается разрешить ключевое слово ‘id’ в поле. Варианты: завершить, task_priority, текст, пользователь, идентификатор пользователя

#python #django

#python #django

Вопрос:

Я работаю над списком задач, в котором есть отдельные пользователи со своим собственным списком. Изначально у меня был 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
 

Но затем, когда я пытаюсь связать одного пользователя с его собственным набором todotask (текстовое поле) и его приоритетами и статусом.

Я добавил одно к одному поле следующим образом:

 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, текст, пользователь, идентификатор пользователя

Я не совсем понял концепцию однозначных полей и, просматривая онлайн-руководства, я в замешательстве, мне нужно создать еще одну таблицу и связать ее с таблицей задач или добавить другое поле с некоторым первичным ключом?

Помогите мне понять эту концепцию. Заранее спасибо.

РЕДАКТИРОВАТЬ: 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.')
 

Новый models.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
 

Встречается

Ошибка целостности при / add NOT NULL не удалось выполнить ограничение: todo_todo.user_id

Комментарии:

1. можете ли вы опубликовать свои представления, которые указывают на ‘/’, как указано в вашем URL, а также шаблон, который отображает представление?

2. Если у вас один случай, у вас может быть более одного todo, затем используйте ForeignKey вместо OneToOneField . и primary_key=True

3. Возможно, вероятность ошибки, которую вы можете использовать Todo.objects.get('id') для извлечения идентификатора для объекта Todo. Поэтому было бы проще, если бы вы разместили свои мнения здесь.

Ответ №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 предложение.

Комментарии:

1. Перед использованием pk в качестве ‘user_id’ я использовал его как логическое значение. Я сделал еще один снимок и столкнулся с той же ошибкой. Я обновил вопрос с помощью views.py файл также можно посмотреть.

2. Вам нужно primary_key полностью удалить и перенести. Пока вы не удалите его, у Todo не будет id поля.

3. Извините, это может быть глупый вопрос, но как нам его удалить? Должен ли я удалить таблицу и снова выполнить миграцию?

4. Обычно достаточно выполнить миграцию, но поскольку вы эффективно добавляете первичный ключ, это усложняется. Если у вас нет каких-либо данных, которые вас интересуют, возможно, было бы лучше удалить db и начать все сначала.

5. Я удалил таблицу и все очистил. Сделаны новые миграции, и он по-прежнему показывает ту же ошибку. Он даже указывает на index.html чего раньше не случалось. Я добавил изображение к вопросу.