Django - удалил объект, используя метод .delete () и теперь получая Exception Тип: IntegrityError - PullRequest
0 голосов
/ 23 марта 2019

Я создал блог журнала обучения, следуя ускоренному курсу Python, и заметил, что есть некоторые темы, которые мне не нужны.Поэтому я использовал learning_log.objects.filter (id = id number) .delete () в оболочке python manage.py для удаления некоторых дублирующих элементов.Затем я попытался добавить новые темы и получил эту ошибку:

Ошибка IntegrityError в / new_topic / NOT NULL не выполнена: learning_logs_topic.owner_id

В файле models.py я попытался передать значение по умолчанию ='' to text = models.TextField (), передавая null = True, пусто = True для models.TextField, выполняя manage.py makemigrations - fake и повторно запуская makemigrations / migrate.Но, похоже, ничего не решает эту проблему.Я пытаюсь избежать удаления своей базы данных и запуска заново, но я думаю, что это может быть единственным решением.

* ОБНОВЛЕНИЕ

Прочитайте документацию ForeignKey и замените "on_delete = models.CASCADE"с помощью "models.SET_NULL, blank = True, null = True", перезапустите миграцию и теперь можете успешно добавлять другие темы / записи.

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

class Topic(models.Model):
    """A topic the user is learning about."""
    id = models.IntegerField(primary_key=True)
    text = models.CharField(max_length=200,default=" ")
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        """Returning a string represetation of the model."""
        return self.text

class Entry(models.Model):
    """Something specific learned about a topic."""
    id = models.IntegerField(primary_key=True) #added after deleting topic and getting error
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    text = models.TextField(null=True,blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'entries'

    def __str__(self):
        """Return a string representation of model"""
        if len(self.text) > 50:
            return self.text[:50] + '...'
        else:
            return self.text
Views.py
def index(request):
    '''The home page for Learning Log'''
    return render(request, 'learning_logs/index.html')

def topics(request):
    """Show all topics"""
    topics = Topic.objects.order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)

def topic(request, topic_id):
    '''Show all topics and all its entries.'''
    topic = Topic.objects.get(id=topic_id)
    entries = topic.entry_set.order_by('-date_added')    
    context = {'topic': topic, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)

def new_topic(request):
    '''Add a new topic'''
    if request.method != 'POST':
        # No data submitted, create a blank form
        form = TopicForm()
    else:
        # POST data submitted, processes data
        form = TopicForm(data=request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topics'))
    context = {'form': form}
    return render(request, 'learning_logs/new_topic.html', context)
new_topic.html
{% extends 'learning_logs/base.html' %}

{% block content %}
    <p>Add a topic:</p>
    <form action="{% url 'learning_logs:new_topic' %}"method='post'>
        {% csrf_token %}
        {{ form.as_p }}
        <button name="submit"> add topic</button>
    </form>
{% endblock content %}

Ожидаемый результат - нажать«Добавить новую тему», введите тему в текстовое поле, нажмите «Добавить тему», чтобы вернуться на страницу «Темы» с недавно добавленной темой в списке.

...