django.db.utils.Ошибка целостности: нулевое значение в столбце «author_id» отношения «movie_movie» нарушает ограничение not-null понятия не имею, почему это происходит

#django

#django

Вопрос:

Похоже, что модель получает только «null». Я попытался напечатать запрос пользователя в представлениях, и все было в порядке.

Просмотр кодов.

 def add_item(request):  # add new media
quote = random.choice(quotes)
if request.method == "POST":
    new_item = MovieForm(request.POST)
    new_item.save(commit=False)
    new_item.author = request.user
    new_item.save()
    return redirect('movie:movie_library')
else:
    movie_form = MovieForm()
return render(request, 'movie/add_movie.html',
              context={'form': movie_form,
                       'quote': quote})
 

Модель

 class Movie(models.Model):
STATUS_CHOICES = (
    ('Movie', 'Movie'),
    ('Tv-series', 'Tv Series'),
    ('Anime', 'Anime'),
)
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=50, null=False)
type = models.CharField(max_length=15,
                        choices=STATUS_CHOICES,
                        default='')
year = models.IntegerField(null=True, blank=True)
rating = models.FloatField(max_length=10, null=False)
review = models.TextField(null=True, blank=True)
img_url = models.TextField(default='https://betravingknows.com/wp-content/uploads/2017/'
                                   '06/video-movie-placeholder-image-grey.png')
active = models.BooleanField(default=True)

def __str__(self):
    return self.title
 

формы

 from django import forms
from movie.models import Movie


class MovieForm(forms.ModelForm):
    class Meta:
        model = Movie
        fields = ('title', 'type', 'year', 'review',
                  'rating', 'img_url', 'active')
 

ошибка

django.db.utils.Ошибка целостности: нулевое значение в столбце «author_id» отношения «movie_movie» нарушает ненулевое ограничение ПОДРОБНО: ошибка строки содержит (46, Sapiens, фильм, 435, 6.5, высота, https://betravingknows.com/wp-content/uploads/2017/06/video-movi …, t, null).

Ответ №1:

Не request.user является ли return AnonymousUser вместо зарегистрированного? В этом случае author будет получено None , что вызовет вашу ошибку. Вы можете добавить декоратор login_required в свой вид, чтобы избежать этого:

 from django.contrib.auth.decorators import login_required

@login_required
def add_item(request):
    ...
 

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

1. @login_required уже существует, и отображается та же ошибка. Без отображения сообщения об ошибке login_required anonymoususer. » (46, Sapiens, Фильм, 435, 6.5, высота, betravingknows.com/wp-content/uploads/2017/06/video-movi …, t, null).» последнее значение «null» здесь присваивается пользователю.

2. Можете ли вы отредактировать свою тему, чтобы отразить фактический код для вида и формы, которые вы используете? Также возникает такая же ошибка с декоратором?

Ответ №2:

Фактически, в вашем коде вы присваиваете значение не request.user своему новому объекту, а своей форме, поэтому оно не сохраняется.

form.save() возвращает новый объект, и это то, что вам нужно здесь манипулировать.

Кроме того, рассмотрите возможность обработки случая, когда форма недопустима с form.is_valid() помощью .

 if request.method == "POST":
    form = MovieForm(request.POST)
    if form.is_valid():
        new_item = form.save(commit=False)
        new_item.author = request.user
        new_item.save()
 

Надеюсь, это помогло.

Ответ №3:

На всякий случай. Если вы используете фреймворк Django rest и ваш сериализатор настроен следующим образом: author является внешним ключом. Если ваш POST запрос пытается создать объект db модели с помощью внешнего ключа, убедитесь, что он не указан как доступный только для чтения.

 class PostSerializer(serializers.ModelSerializer):
    author = serializers.ReadOnlyField(source='author.username')  # just comment this
    # author = UserSerializer(read_only=True) # remove this also if present

    ...
 

Пожалуйста, удалите часть, доступную только для чтения. Это останавливает ожидаемый результат. Также убедитесь, что author поле принимает id тип ForeingKey (здесь User ).