Django Rest Framework错误:{“ user”:[“此字段为必填。”]

Dev*_*B2F 1 django django-rest-framework

发布时:

curl -X POST  -H "Authorization: Token sometoken" -d "url=someurl" 127.0.0.1:8000/create/
Run Code Online (Sandbox Code Playgroud)

我得到错误:

{“ user”:[“此字段为必填。”]使用ItemSerializer,

我在SO上看到过其他帖子,它们在谈论使用perform_create,我试图使用它们来保存用户对象,但是由于某些原因,它不起作用。当用户定义如下时,Perform_create起作用:

user = serializers.CharField(
    default=serializers.CurrentUserDefault()
)
Run Code Online (Sandbox Code Playgroud)

但是我想使用用户对象,不仅是存储用户名的CharField

序列化器:

class UserDetailsSerializer(serializers.ModelSerializer):
  class Meta:
    model = UserModel
    fields = ('pk', 'username', 'email', 'first_name', 'last_name')
    read_only_fields = ('email', )


class CategorySerializer(serializers.ModelSerializer):
  class Meta:
    model = Category
    fields = ['cat']

 class CommentSerializer(serializers.HyperlinkedModelSerializer):
      class Meta:
         model = Comment
         fields = [
             'comment',

         ]

class ItemSerializer(serializers.HyperlinkedModelSerializer):
     user = UserDetailsSerializer()
     category = CategorySerializer(many=True)
     thecomments = CommentSerializer(many=True)
     timestamp = serializers.SerializerMethodField('get_mytimestamp')

     def get_mytimestamp(self, obj):
         return time.mktime(datetime.datetime.now().timetuple())

     class Meta:
         model = Item

         fields = [
         "url",
         "user",
         "timestamp",
         "categories",
         "thecomments",
    ]
Run Code Online (Sandbox Code Playgroud)

模型:

class Item(models.Model):
    url = models.CharField(max_length=1000)
    user = models.ForeignKey('auth.User', unique=False)
    timestamp = models.DateTimeField(auto_now_add=True)
    url = models.CharField(max_length=1000)
    categories = models.ManyToManyField(Category)
Run Code Online (Sandbox Code Playgroud)

视图:

class ItemCreateAPIView(generics.CreateAPIView):
     serializer_class = ItemSerializer

     def perform_create(self, serializer):
         serializer.save(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)

解:

序列化程序创建项目:

class CreateSerializer(serializers.HyperlinkedModelSerializer):
     timestamp = serializers.SerializerMethodField('get_mytimestamp')

     def get_mytimestamp(self, obj):
         return time.mktime(datetime.datetime.now().timetuple())

     class Meta:
         model = Item

         fields = [
         "url",
         "timestamp",
         ]
Run Code Online (Sandbox Code Playgroud)

views.py

class ItemCreateAPIView(generics.CreateAPIView):
     serializer_class = CreateSerializer

     def perform_create(self, serializer):
         serializer.save(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)

帖子:

curl -X POST  -H "Authorization: Token sometoken" -d "url='someurl'" 127.0.0.1:8000/createitem/
Run Code Online (Sandbox Code Playgroud)

Ykh*_*Ykh 5

class ItemSerializer(serializers.HyperlinkedModelSerializer):
     user = UserDetailsSerializer()
     category = CategorySerializer(many=True)
     thecomments = CommentSerializer(many=True)
     timestamp = serializers.SerializerMethodField('get_mytimestamp')

     def get_mytimestamp(self, obj):
         return time.mktime(datetime.datetime.now().timetuple())

     class Meta:
         model = Item

         fields = [
         "url",
         "user",
         "timestamp",
         "categories",
         "thecomments",
         ]
        extra_kwargs = {'user': {'required': False}}
Run Code Online (Sandbox Code Playgroud)

添加extra_kwargs = {'user': {'required': False}}到您的序列化器Meta