【问题标题】:Django Rest Framework error: {"user":["This field is required."]Django Rest Framework 错误:{"user":["This field is required."]
【发布时间】:2017-10-20 03:48:14
【问题描述】:

发布时:

curl -X POST  -H "Authorization: Token sometoken" -d "url=someurl" 127.0.0.1:8000/create/

我得到错误:

{"user":["This field is required."] with the ItemSerializer,

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

user = serializers.CharField(
    default=serializers.CurrentUserDefault()
)

但我想使用用户对象,而不仅仅是存储用户名的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",
    ]

型号:

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)

查看:

class ItemCreateAPIView(generics.CreateAPIView):
     serializer_class = ItemSerializer

     def perform_create(self, serializer):
         serializer.save(user=self.request.user)

解决办法:

用于创建项目的序列化器:

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",
         ]

views.py

class ItemCreateAPIView(generics.CreateAPIView):
     serializer_class = CreateSerializer

     def perform_create(self, serializer):
         serializer.save(user=self.request.user)

帖子:

curl -X POST  -H "Authorization: Token sometoken" -d "url='someurl'" 127.0.0.1:8000/createitem/

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:
    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}}
    

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

    【讨论】:

    • 我仍然得到同样的错误,但它必须是在正确的方向,有像 {'user': {required:False}} 这样的东西是有意义的。我也试过 user = UserDetailsS​​erializer(required=False, read_only=True) 但它给出:.create() 方法默认不支持可写嵌套字段。为序列化器app.serializers.ItemSerializer 写一个显式的.create() 方法,或者在嵌套的序列化器字段上设置read_only=True
    • 顺便说一句,使用 get 请求时不会出现“此字段为必填项”错误,这与发布时创建用户对象有关。
    • 删除ItemSerializer 中的user = UserDetailsSerializer() 后一切正常,不同的序列化器用于发布和获取
    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多