Django Rest Framework 设置 user/owner 到 ModelSerializer(推文)
Django Rest Framerowk setting user/owner to a ModelSerializer (Tweet)
我是 DRF 新手。
在创建 Twitter 应用程序时,我遇到了序列化程序的问题。由于需要用户 - 我需要以某种方式将实际用户传递给 TweetSerializer class。我尝试了不同的方法,但都不起作用。
这给我一个错误
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
error image
error image continued
我也试图通过将其传递给序列化器构造函数来吸引用户
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)
解决方案是传递上下文,正如我从 CurrentUserDefault() 的 drf 文档中读到的那样
@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.
我是 DRF 新手。 在创建 Twitter 应用程序时,我遇到了序列化程序的问题。由于需要用户 - 我需要以某种方式将实际用户传递给 TweetSerializer class。我尝试了不同的方法,但都不起作用。
这给我一个错误
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
error image
error image continued
我也试图通过将其传递给序列化器构造函数来吸引用户
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)
解决方案是传递上下文,正如我从 CurrentUserDefault() 的 drf 文档中读到的那样
@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.