微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通用模型上的 Django 多租户数据库错误

如何解决通用模型上的 Django 多租户数据库错误

我当前的应用程序是多租户的,所以我按用户管理一个模式,我的应用程序中有很多部分用户可以添加评论,所以我决定使用通用模型,如下所示:

class Comment(models.Model):
    date = models.DateTimeField(
        _('Date'),blank=False,auto_Now=True,db_index=False
    )
    comment = models.TextField(
        _('Comment'),null=False
    )
    user = models.ForeignKey(
        'security.User',related_name='comments',verbose_name=_('User'),on_delete=models.CASCADE,)
    content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()

它适用于单个用户/模式,它可以正确保存评论,但是当我使用其他用户登录并尝试保存评论时,会出现下一个错误

Traceback (most recent call last):
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/backends/utils.py",line 87,in _execute
    return self.cursor.execute(sql,params)
psycopg2.IntegrityError: insert or update on table "generic_comment" violates foreign key constraint "generic_comment_content_type_id_068f197c_fk_django_co"
DETAIL:  Key (content_type_id)=(2) is not present in table "django_content_type".


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/core/handlers/exception.py",line 34,in inner
    response = get_response(request)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/core/handlers/base.py",line 115,in _get_response
    response = self.process_exception_by_middleware(e,request)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/core/handlers/base.py",line 113,in _get_response
    response = wrapped_callback(request,*callback_args,**callback_kwargs)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/views/decorators/csrf.py",line 54,in wrapped_view
    return view_func(*args,**kwargs)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/rest_framework/viewsets.py",line 116,in view
    return self.dispatch(request,*args,**kwargs)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/rest_framework/views.py",line 495,in dispatch
    response = self.handle_exception(exc)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/rest_framework/views.py",line 455,in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/rest_framework/views.py",line 492,in dispatch
    response = handler(request,**kwargs)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/rest_framework/mixins.py",line 21,in create
    self.perform_create(serializer)
  File "/home/jsalvad0r/Documents/dev/tuequipovirtual/my_app-backend/my_app/security/api/views_project.py",line 159,in perform_create
    comment = serializer.save()
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/rest_framework/serializers.py",line 214,in save
    self.instance = self.create(validated_data)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/rest_framework/serializers.py",line 943,in create
    instance = ModelClass._default_manager.create(**validated_data)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/models/manager.py",line 82,in manager_method
    return getattr(self.get_queryset(),name)(*args,**kwargs)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/models/query.py",line 422,in create
    obj.save(force_insert=True,using=self.db)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/models/base.py",line 741,in save
    force_update=force_update,update_fields=update_fields)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/models/base.py",line 779,in save_base
    force_update,using,update_fields,File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/models/base.py",line 870,in _save_table
    result = self._do_insert(cls._base_manager,fields,update_pk,raw)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/models/base.py",line 908,in _do_insert
    using=using,raw=raw)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/models/manager.py",line 1186,in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/models/sql/compiler.py",line 1335,in execute_sql
    cursor.execute(sql,params)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/backends/utils.py",line 102,in execute
    return super().execute(sql,line 67,in execute
    return self._execute_with_wrappers(sql,params,many=False,executor=self._execute)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/backends/utils.py",line 76,in _execute_with_wrappers
    return executor(sql,many,context)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/backends/utils.py",params)
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/utils.py",line 89,in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/jsalvad0r/.pyenv/versions/my_app/lib/python3.6/site-packages/django/db/backends/utils.py",params)
django.db.utils.IntegrityError: insert or update on table "generic_comment" violates foreign key constraint "generic_comment_content_type_id_068f197c_fk_django_co"
DETAIL:  Key (content_type_id)=(2) is not present in table "django_content_type".

当我重新启动服务器时,不再向我抛出错误,怎么可能会采用上一个会话的 content_type_id?我在谷歌上搜索服务器是否在数据库层管理某种缓存,但我没有找到任何东西。有人可以帮忙吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。