Операционная ошибка: нет такого столбца: users_userscore.id - PullRequest
0 голосов
/ 10 апреля 2020

Для моего веб-приложения у меня есть два приложения, одно из которых morse_logs , основное приложение; во-вторых, это приложение users , которое в основном обрабатывает сведения о пользователях и аутентификацию, и т. д. c.

В настоящее время в моем приложении users у меня есть UserProfile модель, которая имеет одну переменную описание , и сейчас я пытаюсь добавить еще одну переменную оценка для пользователя, чтобы у каждого пользователя была одна переменная счета / поле для хранения их результатов, и результат пользователя будет обновляться после определенных действий в morse_logs game1. html и morse_logs / views.py (основное приложение).

Я действительно не знаком с моделированием и созданием таблиц, столбцов и тому подобного ...

И когда я выполняю миграции, это выдает мне ошибку, такую ​​как Operaional Error: таблица "users_userscore" уже существует ...

Я попытался удалить файлы py миграции, но это не сработало

весь мой код находится на github: https://github.com/phl6/morse_log

Итак, мой вопрос: как мне отредактировать файл модели, чтобы у меня была переменная / поле оценки для каждого пользователя, которую можно обновить в morse_logs (основное приложение).

users / model.py

from django.db import models
from django import forms
from django.contrib.auth.models import User
from django.db.models.signals import post_save

# Create your models here.


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    description = models.CharField(max_length=100, default='')
    #score = models.CharField(User, max_length=10, default=0)


def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

    post_save.connect(create_profile, sender=User)


class UserScore(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    score = models.IntegerField(default=0, unique=True, null=False, db_index=True)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """Returns a string representation of the model"""
        return self.score

morse_logs / views.py


@login_required()
def game1(request):

    if request.user and not request.user.is_anonymous:
        user = request.user
    #else:
        #Throw some raised exception here as the user is not valid...

    """The Game 1 page"""
    val1 = request.GET.get('ans1', '')
    res = "Incorrect"

    user_score = UserScore.objects.get_or_create(user=user)

    if val1 == 2:
        #user's score declared in model increase 5points
        #display correct and 5 points added to user
        res = "Correct"
        user_score.score += 5
        user_score.save()
    else:
        #user's score declared in model has no point
        #display incorrect and 0 point added to user
        res = "Incorrect"

    return render(request, 'morse_logs/game1.html', {'result': res})

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Из ошибки ясно, что столбцы базы данных уже созданы из предыдущей миграции.

Чтобы исправить это, вы можете

  1. Если вы удалили всю миграцию файлы, запустите python manage.py makemigrations, чтобы воссоздать файлы миграции. Если у вас есть все файлы миграции, перейдите к 2.
  2. Запустите фиктивную начальную миграцию, запустив python manage.py migrate --fake-initial

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

С официальной документацией django можно ознакомиться здесь: https://docs.djangoproject.com/en/3.0/topics/migrations/#django .db.migrations.Migration.initial

0 голосов
/ 11 апреля 2020

Я исправил проблему, добавив параметр primary_key в пользовательском поле один к одному полю, закомментировав поле даты и приведя возвращаемое значение к стр.

class UserScore(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    score = models.IntegerField(default=0)
    # date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """Returns a string representation of the model"""
        return str(self.score)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...