python - Django 用户模型外键
问题描述
我正在努力在 Django 中编写关系数据库。基本上我想要实现的是为其中一个表创建一个用户外键。
我在这里发现了很多类似的问题,但由于某种原因,它似乎对我的事业不起作用,也许是因为版本或我不知道。
这是我的模型:
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=255)
user = models.ForeignKey(User, on_delete=models.CASCADE)
看法:
from rest_framework import viewsets
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from .models import Category
from .serializers import CategorySerializer
class CategoryView(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
permission_classes = [IsAuthenticated]
authentication_classes = [SessionAuthentication, BasicAuthentication]
为了进行身份验证,我使用了内置功能
path('api-auth/', include('rest_framework.urls')),
这是我得到的错误:
IntegrityError at /category/
NOT NULL constraint failed: category_category.user_id
Request Method: POST
Request URL: http://127.0.0.1:8000/category/
Django Version: 2.2.5
Exception Type: IntegrityError
Exception Value:
NOT NULL constraint failed: category_category.user_id
Exception Location: C:\Users\Terkea\Anaconda3\envs\django_api_template\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 383
Python Executable: C:\Users\Terkea\Anaconda3\envs\django_api_template\python.exe
Python Version: 3.7.5
Python Path:
['C:\\Users\\Terkea\\PycharmProjects\\django_api_template',
'C:\\Users\\Terkea\\PycharmProjects\\django_api_template',
'C:\\Program Files\\JetBrains\\PyCharm '
'2019.2.3\\plugins\\python\\helpers\\pycharm_display',
'C:\\Users\\Terkea\\Anaconda3\\envs\\django_api_template\\python37.zip',
'C:\\Users\\Terkea\\Anaconda3\\envs\\django_api_template\\DLLs',
'C:\\Users\\Terkea\\Anaconda3\\envs\\django_api_template\\lib',
'C:\\Users\\Terkea\\Anaconda3\\envs\\django_api_template',
'C:\\Users\\Terkea\\Anaconda3\\envs\\django_api_template\\lib\\site-packages',
'C:\\Program Files\\JetBrains\\PyCharm '
'2019.2.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
Server time: Wed, 11 Dec 2019 08:08:11 +0000
解决方案
您可以覆盖perform_create方法。
class CategoryView(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
permission_classes = [IsAuthenticated]
authentication_classes = [SessionAuthentication, BasicAuthentication]
def perform_create(self, serializer):
serializer.save(user=self.request.user)
来自文档:
perform_create(self, serializer) - 保存新对象实例时由 CreateModelMixin 调用。
推荐阅读
- reactjs - Gatsby - SSR i18n 翻译加载到客户端
- php - SMTP 错误 451 临时本地 - 请稍后再试
- javascript - 如何在 RESTful 架构中从后端获取数据?
- python - 在 Pandas 中基于条件分配价值的有效方法?
- curl - 无法使用 kubernetes 服务的 dns 地址使用 curl
- python - 在单个 Flask 或 Django 中运行多个虚拟环境
- python - 在 Python 中重新排列 csv 的格式
- symfony - 有没有办法告诉教义不要碰特定的表格?
- c# - WPF DataGrid 从后面的代码中覆盖单行的选择颜色
- logstash - UserId 的 Logstash Grok 模式