Django IntegrityError:列"interestreceiver_id"中的空值;关系"HomeFeed_interest"违反非空约束 [英] Django IntegrityError: null value in column "interestreceiver_id" of relation "HomeFeed_interest" violates not-null constraint

查看:47
本文介绍了Django IntegrityError:列"interestreceiver_id"中的空值;关系"HomeFeed_interest"违反非空约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Django:为什么由于完整性错误而未提交我的提交兴趣表单?我写错了我的观点或模板吗?我应该如何解决这个错误,因为我从未遇到过.我在这个网站上搜索并看到了一些个人资料示例,但我的是博客文章,我真的不明白他们的更改如何解决该错误.

Django : Why is my submit interest form not submitted because of an integrity error issue? Did I write my view or template wrongly? How should I solve this error as i've never encountered before. i searched on this website and saw some profile examples but mine is blog post and i dont really understand how their change could solve the error..

应该是"obj.interestsender = user"而不是"object".interestreceiver = user",并且在视图中是否还需要"obj.interestreceiver = blog_post.author"?谢谢!!!

should it be 'obj.interestsender=user' and not 'object. interestreceiver=user' and whether i also need 'obj.interestreceiver=blog_post.author' in the view? Thank you!!!

我收到以下完整性错误:

I received the following integrity error:

/HomeFeed/submitinterest/slug-5中的IntegrityError列"interestreceiver_id"中的空值;关系"HomeFeed_interest"违反非空约束详细信息:失败行包含(17,2021-01-06 10:54:25.489884 + 00,t,ddfe,efeffe,5,document/Discussion_between_joowon_and_SLDem _-_ 2021-01-05.pdf,13,null,null,1).

IntegrityError at /HomeFeed/submitinterest/slug-5 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).

除了完整性错误外,我还面临以下问题:为什么在我将请求提交到该特定帖子后,我无法将兴趣提交给属于同一用户的其他帖子.因为我的目的是您不能再对同一帖子而不是同一用户提交兴趣.

Apart from the integrity error, I also face the following issue: why is it that after I submit the request to that particular post, I am unable to submit interest to other posts that belong to the same user. Because my intent is that you cannot submit interest again to the same post and not the same user.

views.py

@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

HomeFeed: forms.py:
class SubmitInterestForm(forms.ModelForm):
    class Meta:
        model= Interest
        fields = ['my_name', 'my_thoughts','short_file',]

models.py

models.py

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:

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

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).

'''

推荐答案

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

This error is saying : in you database there is a null value stored whole the column have not null constraint

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

Quick fix: Add to the field causing the error. blank=True, null=True

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

When null is not an option in interestreceiver then you will have to manually remove the null values from the database!

您可以通过运行此命令来实现

You can do that by running this command

Python manage.py dbshel​​l

Python manage.py dbshell

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

Please check that you do not have null values in the database. Null values can be generated automatically if you created new fields. If you adding the field recently then you will have to pass Null= True, no other way. Then you make the blog post view only for authenticated users.

当您提交博客时出现此错误时,您将以某种方式在此处传递Intrestreceiver的空值:

When this error come up when you submit the blog then, you are somehow passing a null value for the intrestreceiver here:

 # 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)

并查看该值是否即将抛出.

and see if the value is coming throw.

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

when the value is coming through and you are still getting the error then I do not know how did you structure your database, review related_field documentation on here: https://docs.djangoproject.com/en/3.1/topics/db/queries/#backwards-related-objects

这篇关于Django IntegrityError:列"interestreceiver_id"中的空值;关系"HomeFeed_interest"违反非空约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆