Django Rest Framework-用户字段不能为空
我正在学习Django和Django Rest Framework来创建API,但我无法理解为什么在运行此命令时:Django Rest Framework-用户字段不能为空,django,django-rest-framework,Django,Django Rest Framework,我正在学习Django和Django Rest Framework来创建API,但我无法理解为什么在运行此命令时: http --json POST http://127.0.0.1:8000/api/v1/stocks/ book_code='Abook' 'Authorization: Token 123243434354353' 我得到一个错误,上面写着: HTTP/1.0 400 Bad Request Allow: GET, POST, HEAD, OPTIONS Content-T
http --json POST http://127.0.0.1:8000/api/v1/stocks/ book_code='Abook' 'Authorization: Token 123243434354353'
我得到一个错误,上面写着:
HTTP/1.0 400 Bad Request
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Date: Thu, 25 May 2017 19:16:37 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Vary: Accept
X-Frame-Options: SAMEORIGIN {
"user": [
"This field is required."
]}
“user”字段是必需的,但我希望它根据我提供的令牌(即经过身份验证的用户)填充用户
这是书架/models.py
:
from django.db import models
from django.contrib.auth.models import User
class Stock(models.Model):
'''
Model representing the stock info.
'''
user = models.ForeignKey(User)
book_code = models.CharField(max_length=14, null=True, blank=True)
def __str__(self):
return self.book_code
from bookstock.models import Stock
from rest_framework import serializers
class StockSerializer(serializers.ModelSerializer):
class Meta:
model = Stock
fields = ('id', 'user', 'book_code')
from rest_framework import generics
from bookstock.models import Stock
from api.serializers import StockSerializer
from rest_framework.permissions import IsAuthenticated
class StockList(generics.ListCreateAPIView):
serializer_class = StockSerializer
permission_classes = (IsAuthenticated,)
def get_queryset(self):
user = self.request.user
return Stock.objects.filter(user=user)
def perform_create(self, serializer):
serializer.save(user=self.request.user, )
def perform_update(self, serializer):
serializer.save(user=self.request.user)
from django.conf.urls import url, include
from api import views
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
url(r'^v1/stocks/$', views.StockList.as_view()),
url(r'^v1/api-token-auth/', obtain_auth_token),
url(r'v1/api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
这是api/serializer.py
:
from django.db import models
from django.contrib.auth.models import User
class Stock(models.Model):
'''
Model representing the stock info.
'''
user = models.ForeignKey(User)
book_code = models.CharField(max_length=14, null=True, blank=True)
def __str__(self):
return self.book_code
from bookstock.models import Stock
from rest_framework import serializers
class StockSerializer(serializers.ModelSerializer):
class Meta:
model = Stock
fields = ('id', 'user', 'book_code')
from rest_framework import generics
from bookstock.models import Stock
from api.serializers import StockSerializer
from rest_framework.permissions import IsAuthenticated
class StockList(generics.ListCreateAPIView):
serializer_class = StockSerializer
permission_classes = (IsAuthenticated,)
def get_queryset(self):
user = self.request.user
return Stock.objects.filter(user=user)
def perform_create(self, serializer):
serializer.save(user=self.request.user, )
def perform_update(self, serializer):
serializer.save(user=self.request.user)
from django.conf.urls import url, include
from api import views
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
url(r'^v1/stocks/$', views.StockList.as_view()),
url(r'^v1/api-token-auth/', obtain_auth_token),
url(r'v1/api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
这是api/views.py
:
from django.db import models
from django.contrib.auth.models import User
class Stock(models.Model):
'''
Model representing the stock info.
'''
user = models.ForeignKey(User)
book_code = models.CharField(max_length=14, null=True, blank=True)
def __str__(self):
return self.book_code
from bookstock.models import Stock
from rest_framework import serializers
class StockSerializer(serializers.ModelSerializer):
class Meta:
model = Stock
fields = ('id', 'user', 'book_code')
from rest_framework import generics
from bookstock.models import Stock
from api.serializers import StockSerializer
from rest_framework.permissions import IsAuthenticated
class StockList(generics.ListCreateAPIView):
serializer_class = StockSerializer
permission_classes = (IsAuthenticated,)
def get_queryset(self):
user = self.request.user
return Stock.objects.filter(user=user)
def perform_create(self, serializer):
serializer.save(user=self.request.user, )
def perform_update(self, serializer):
serializer.save(user=self.request.user)
from django.conf.urls import url, include
from api import views
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
url(r'^v1/stocks/$', views.StockList.as_view()),
url(r'^v1/api-token-auth/', obtain_auth_token),
url(r'v1/api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
这是api/url.py
:
from django.db import models
from django.contrib.auth.models import User
class Stock(models.Model):
'''
Model representing the stock info.
'''
user = models.ForeignKey(User)
book_code = models.CharField(max_length=14, null=True, blank=True)
def __str__(self):
return self.book_code
from bookstock.models import Stock
from rest_framework import serializers
class StockSerializer(serializers.ModelSerializer):
class Meta:
model = Stock
fields = ('id', 'user', 'book_code')
from rest_framework import generics
from bookstock.models import Stock
from api.serializers import StockSerializer
from rest_framework.permissions import IsAuthenticated
class StockList(generics.ListCreateAPIView):
serializer_class = StockSerializer
permission_classes = (IsAuthenticated,)
def get_queryset(self):
user = self.request.user
return Stock.objects.filter(user=user)
def perform_create(self, serializer):
serializer.save(user=self.request.user, )
def perform_update(self, serializer):
serializer.save(user=self.request.user)
from django.conf.urls import url, include
from api import views
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
url(r'^v1/stocks/$', views.StockList.as_view()),
url(r'^v1/api-token-auth/', obtain_auth_token),
url(r'v1/api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
我错过了什么?根据SO的回答,
perform\u create
和perform\u update
覆盖应该填充用户权限 序列化程序验证后,视图的create
方法调用perform\u create
方法。在此阶段,DRF将找到并标记缺失的用户字段:
有多种方法可以解决此问题,即将序列化程序字段设置为read\u only=True
或覆盖序列化程序上的validate\u user
方法
我认为最优雅的方式是使用DRF的currentuserdefault
验证器:
(将
HiddenField
替换为CharField
或您喜欢的任何内容)序列化程序验证后,视图的create
方法调用perform\u create
方法。在此阶段,DRF将找到并标记缺失的用户字段:
有多种方法可以解决此问题,即将序列化程序字段设置为read\u only=True
或覆盖序列化程序上的validate\u user
方法
我认为最优雅的方式是使用DRF的currentuserdefault
验证器:
(将HiddenField
替换为CharField
或您喜欢的任何内容)