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)
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
| 归档时间: |
|
| 查看次数: |
2731 次 |
| 最近记录: |