问题描述
我是DRF的新手。 在创建Twitter应用程序时,我遇到了序列化程序的问题。由于用户是必需的-我需要某种方式将实际用户传递给TweetSerializer类。我尝试了其他无效的方法。
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
serializer = TweetSerializer(owner=request.user)
也不起作用
class TweetSerializer(serializers.ModelSerializer):
try:
owner = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
except Exception as exception:
print(exception)
class Meta:
model = Tweet
fields = '__all__'
read_only_fields = ['owner']
def validate(self,attrs):
if len(attrs['content']) > MAX_TWEET_LENGTH:
raise serializers.ValidationError("This tweet is too long")
return attrs
class Tweet(models.Model):
id = models.AutoField(primary_key=True)
owner = models.ForeignKey('auth.User',related_name='tweets',on_delete=models.CASCADE)
content = models.TextField(blank=True,null=True)
image = models.FileField(upload_to='images/',blank=True,null=True)
class Meta:
ordering = ['-id']
@api_view(['POST'])
def tweet_create_view(request,*args,**kwargs):
serializer = TweetSerializer(data=request.POST)
user = request.user
if serializer.is_valid():
serializer.save()
else:
print(serializer.errors)
return JsonResponse({},status=400)
try:
pass
except Exception as e:
print(str(e))
return JsonResponse({},status=400,safe=False)
return JsonResponse({},status=201)
解决方法
解决方案是传递我从drf文档中读取的CurrentUserDefault()的上下文
@api_view(['POST'])
def tweet_create_view(request,*args,**kwargs):
context = {
"request" : request
}
serializer = TweetSerializer(data=request.POST,context=context)
if serializer.is_valid():
serializer.save()
return JsonResponse({},status=201)
A default class that can be used to represent the current user. In order to use this,the 'request' must have been provided as part of the context dictionary when instantiating the serializer.