首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django IntegrityError:关系"HomeFeed_interest“的列"interestreceiver_id”中的空值违反了非空约束

Django IntegrityError:关系"HomeFeed_interest“的列"interestreceiver_id”中的空值违反了非空约束
EN

Stack Overflow用户
提问于 2021-01-06 19:00:14
回答 1查看 520关注 0票数 0

Django :为什么我的提交兴趣表单因为完整性错误问题而没有提交?我的视图或模板写错了吗?我应该如何解决这个我以前从未遇到过的错误。我在这个网站上搜索,看到了一些个人资料的例子,但我的是博客文章,我真的不明白他们的改变如何解决这个错误。

它应该是'obj.interestsender=user‘而不是'object. interestreceiver=user’吗?我是否也需要在视图中使用'obj.interestreceiver=blog_post.author‘?谢谢!

我收到以下完整性错误:

关系“documents/Discussion_between_joowon_and_SLDem_-_2021-01-05.pdf,”的列"interestreceiver_id“中的提交/提交兴趣/slug-5处的空值违反了非空约束详细信息:失败的行包含(17,2021-01-06 IntegrityError,t,ddfe,efeffe,5,HomeFeed_interest 13,10:54:25.489884+00,null,null,1)。

除了完整性错误,我还面临以下问题:为什么在我向该特定帖子提交请求后,我无法向属于同一用户的其他帖子提交兴趣。因为我的意图是你不能再向同一个帖子而不是同一个用户提交兴趣。

views.py

代码语言:javascript
复制
@login_required
def submit_interest_view(request, slug):
    user = request.user
    blog_post = get_object_or_404(BlogPost, slug=slug)
    num_blogpost = BlogPost.objects.filter(author=user).count()
    if blog_post.author.email == user.email:
        return HttpResponse('You cannot submit interest to your own post.')
    interest_requests = Interest.objects.filter(interestsender=user, interestreceiver=blog_post.author, is_active=True)
    if interest_requests.exists():
        return HttpResponse('You have already submitted your interest to this post.')
    if request.method == 'POST':  # use request.method == 'POST' to submit POST request (like submitting a form)
        form = SubmitInterestForm(request.POST, request.FILES)
        if form.is_valid():
            obj = form.save(commit=False)
            author = Account.objects.get(email=user.email) # use 'author = user.account' if there is OneToOne relation between user and account
            obj.author = author
            obj.blog_post = blog_post
            obj.save()
            messages.success(request, 'Your interests have been submitted', extra_tags='submittedinterest')
            context['success_message'] = "Updated"
            if request.META.get('HTTP_REFERER') == request.build_absolute_uri(reverse("HomeFeed:main")):
                return redirect(reverse("HomeFeed:main"))
            elif request.META.get('HTTP_REFERER') == request.build_absolute_uri(reverse("HomeFeed:detail", kwargs={'slug': slug })):        
                return redirect(reverse('HomeFeed:detail', kwargs={'slug': slug}))
            else:   
                return redirect(reverse('HomeFeed:main'))     
            #return redirect(reverse('HomeFeed:detail', kwargs={'slug': slug})) # redirect to your post detail but use reverse to pass kwargs not just redirect
        else:
            messages.warning(request, 'Something went wrong. Please try again..', extra_tags='wronginterest')
            return render(request, "HomeFeed/submitinterest.html", {'form': form,'user': user, 'num_blogpost': num_blogpost, 'blog_post': blog_post}) 
    else:
        form = SubmitInterestForm()  #  if request.method isnt POST you still need to define your form so it can be displayed
    return render(request, "HomeFeed/submitinterest.html", {'form': form,'user': user, 'num_blogpost': num_blogpost, 'blog_post': blog_post}) # context dict 

forms.py

代码语言:javascript
复制
HomeFeed: forms.py:
class SubmitInterestForm(forms.ModelForm):
    class Meta:
        model= Interest
        fields = ['my_name', 'my_thoughts','short_file',]

models.py

代码语言:javascript
复制
class Interest(models.Model):
   interestsender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='interestsender', on_delete=models.CASCADE)
   interestreceiver = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='interestreceiver', on_delete=models.CASCADE)
   timestamp        = models.DateTimeField(auto_now_add=True)
   is_active            = models.BooleanField(blank=False, null=False, default=True)
   my_name           = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   blog_post = models.ForeignKey(BlogPost, on_delete=models.CASCADE)
   my_thoughts         = models.TextField(max_length=5000, null=False, blank=False)
   short_file      = models.FileField(upload_to='documents/', null=True, blank=True)

   
  def upload_location(instance, filename):
 #you define this variable called file_path. It belongs to the HomeFeed app, and takes in the parameter of author id, title of blog post with the file name that the author uploads it, and you want to format it 
 file_path = 'HomeFeed/{author_id}/{title}-{filename}'.format(
    author_id=str(instance.author.id),title=str(instance.chief_title), filename=filename)
    #the above will let you insert the strings, you want to take ID of the user who is uploading and converting it into a string, and also the title and file name, converting them into string
 # return file path means where the images is stored, either the local machine/ production environment which will be the name file stored in the content delivery network
 return file_path
 
 class BlogPost(models.Model):
 chief_title                    = models.CharField(max_length=50, null=False, blank=False)
 body                   = models.TextField(max_length=5000, null=False, blank=False)
 likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='blog_posts', blank=True)
 author                     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
 slug                   = models.SlugField(blank=True, unique=True)
 date_published             = models.DateTimeField(auto_now_add=True, verbose_name="date published")
 
 
class Account(AbstractBaseUser):
 email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
 username               = models.CharField(max_length=30, unique=True) 
 date_joined                = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
 last_login             = models.DateTimeField(verbose_name='last login', auto_now=True)
 is_admin               = models.BooleanField(default=False)
 is_active              = models.BooleanField(default=True)
 is_staff               = models.BooleanField(default=False)
 is_superuser           = models.BooleanField(default=False)

 USERNAME_FIELD = 'email'
 REQUIRED_FIELDS = ['username']

html:

代码语言:javascript
复制
submit_interest.thml


   <form method="post" enctype="multipart/form-data">{% csrf_token %}
    
  <div class="form-group">
   <input class="form-control bg-white form-control-plaintext c" rows="10" type="text" name="my_name" id="my_name" placeholder="Name: {{ request.user.username }}" readonly></input>
  </div>



 <div class="form-group">
   <label for="my_thoughts text-dark">thoughts:</label>
   <textarea  class="form-control" rows="6" type="text" name="my_thoughts" id="my_thoughts" placeholder="My thoughts..." required></textarea >
  </div>


    <label for="short_file " class="text-dark">Brief file (Optional):</label>
    <input type="file"  class="btn btn-md btn-light" name="short_file" id="short_file"> <!--<button type="submit" class="btn btn-md btn-info">Upload</button>-->
   {% if uploaded_file_url %}
    <p>File uploaded at: <a href="{{ uploaded_file_url }}">{{ uploaded_file_url }}</a></p>
   {% endif %}

     
   <button class="submit-button btn btn-lg btn-primary mt-3 btn-block col-lg-6 offset-lg-3 " type="submit">Submit Interest</button>

 
  </form>

urls.py

代码语言:javascript
复制
app_name = 'HomeFeed'
urlpatterns = [
    path('', home_feed_view , name= "main"),
    path('submitinterest/<slug>', submit_interest_view, name= "submitinterest"),

`



Traceback:
'''
Traceback (most recent call last):
  File "lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "HomeFeed/views.py", line 262, in submit_interest_view
    obj.save()
  File "lib/python3.8/site-packages/django/db/models/base.py", line 740, in save
    self.save_base(using=using, force_insert=force_insert,
  File "lib/python3.8/site-packages/django/db/models/base.py", line 777, in save_base
    updated = self._save_table(
  File "lib/python3.8/site-packages/django/db/models/base.py", line 870, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "lib/python3.8/site-packages/django/db/models/base.py", line 907, in _do_insert
    return manager._insert([self], fields=fields, return_id=update_pk,
  File "/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "lib/python3.8/site-packages/django/db/models/query.py", line 1186, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1375, in execute_sql
    cursor.execute(sql, params)
  File "lib/python3.8/site-packages/django/db/backends/utils.py", line 99, in execute
    return super().execute(sql, params)
  File "lib/python3.8/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "lib/python3.8/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "lib/python3.8/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: null value in column "interestreceiver_id" of relation "HomeFeed_interest" violates not-null constraint
DETAIL:  Failing row contains (17, 2021-01-06 10:54:25.489884+00, t, ddfe, efeffe, 5, documents/Discussion_between_joowon_and_SLDem_-_2021-01-05.pdf, 13, null, null, 1).

'''
EN

回答 1

Stack Overflow用户

发布于 2021-01-06 20:14:26

此错误表示:在您的数据库中有一个null值存储在整个列中,该列没有null约束

快速修复:添加到导致错误的字段。blank=True,null=True

如果interestreceiver中没有null选项,那么您将不得不手动从数据库中删除NULL值!

您可以通过运行以下命令来执行此操作

Python manage.py dbshell

编辑:

请检查数据库中是否没有空值。如果您创建了新字段,则可以自动生成空值。如果您最近添加了字段,则必须传递Null= True,没有其他方法。然后,只为经过身份验证的用户创建博客文章视图。

当你提交博客的时候出现这个错误,你在这里传递了一个null值给intrestreceiver:

代码语言:javascript
复制
 # add this line before intrest_request to make sure you are not passing Null value
  print(blog_post.author, user)
  interest_requests = Interest.objects.filter(interestsender=user, 
                    interestreceiver=blog_post.author, is_active=True)

看看这个值是否会抛出。

当值通过时,您仍然收到错误,然后我不知道您是如何构建数据库的,请查看此处的related_field文档:https://docs.djangoproject.com/en/3.1/topics/db/queries/#backwards-related-objects

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65594553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档