Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Rest Framework-用户字段不能为空_Django_Django Rest Framework - Fatal编程技术网

Django Rest Framework-用户字段不能为空

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

我正在学习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-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
或您喜欢的任何内容)