Django rest framework 如何在drf的ModelSerializer的create()中保存登录用户?
Models.pyDjango rest framework 如何在drf的ModelSerializer的create()中保存登录用户?,django-rest-framework,Django Rest Framework,Models.py class CustomTarget(models.Model): target_red = models.CharField(max_length=64, blank=True, null=True) target_amber = models.CharField(max_length=64, blank=True, null=True) target_green = models.CharField(max_length=64, blank=True, null=True
class CustomTarget(models.Model):
target_red = models.CharField(max_length=64, blank=True, null=True)
target_amber = models.CharField(max_length=64, blank=True, null=True)
target_green = models.CharField(max_length=64, blank=True, null=True)
remarks = models.CharField(max_length=256, blank=True, null=True)
flag = models.BooleanField(default=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
project = models.ForeignKey(ProjectsMaster, on_delete=models.CASCADE)
metric = models.ForeignKey(MetricsMaster, on_delete=models.CASCADE)
类元:
db_表='自定义_目标'
共同唯一=(“用户”、“项目”、“度量”),)
序列化程序.py
class CustomTargetSerializer(serializers.ModelSerializer):
"""
"""
logger.info("Control entered into CustomTargetSerializer class")
class Meta:
model = CustomTarget
fields = ('id', 'target_red', 'flag', 'user', 'project', 'target_amber', 'target_green','remarks', 'metric')
def create(self, validated_data):
"""
:param validated_data:
:return:
"""
data = CustomTarget(target_red=validated_data["target_red"],
user=User(validated_data["user"]),
project=ProjectsMaster(validated_data["project"]),
target_amber=validated_data["target_amber"],
target_green=validated_data["target_green"],
remarks=validated_data["remarks"],
metric=MetricsMaster(validated_data["metric"]),
flag=True, )
data.save()
return data
views.py
@api_view(["PUT"])
@renderer_classes((JSONRenderer,))
def custom_target(request):
"""
To add new data and update existing data in custom_target table.
:param request:
:return:
"""
logger.info("Control entered into custom_target")
return_dict = dict()
try:
metric_data = request.data
metric_config_obj = matrix_config_filter(metric_data)
if metric_config_obj.exists() is True:
if metric_config_obj[0].flag is True:
custom_serializer = CustomTargetSerializer(data=request.data)
custom_tar_obj = CustomTarget.objects.filter(metric=request.data['metric'])
if custom_tar_obj.exists():
custom_serializer.update(validated_data=request.data, instance=custom_tar_obj)
else:
if custom_serializer.is_valid(raise_exception=ValueError):
custom_serializer.create(validated_data=request.data)
return_dict["msg"] = "success"
status_msg = status.HTTP_200_OK
except Exception as e:
logger.error("Error from custom_target: %s" % e)
return_dict["msg"] = "failed"
status_msg = status.HTTP_400_BAD_REQUEST
return Response(return_dict, status=status_msg)
这里,我给出了硬编码的用户id,但我想将登录用户的用户id保存在序列化程序的create()中。
此处用户保存在auth_user表中,并与自定义_目标表具有外键关系。
我尝试了很多方法,但没有在序列化程序中获得request.user。您可以将其与as一起使用
类CustomTargetSerializer(serializers.ModelSerializer):
user=serializers.PrimaryKeyRelatedField(queryset=user.objects.all(),default=serializers.CurrentUserDefault())
#您的代码
更新-1:完整的序列化程序
class CustomTargetSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), default=serializers.CurrentUserDefault())
class Meta:
model = CustomTarget
fields = ('id', 'target_red', 'flag', 'user', 'project', 'target_amber', 'target_green', 'remarks', 'metric')
def create(self, validated_data):
user = validated_data.pop('user')
project = validated_data.po('project')
metric = validated_data.pop('metric')
instance = CustomTarget.objects.create(
user=user,
project=project,
metric=metric,
**validated_data
)
return instance
类CustomTargetSerializer(serializers.ModelSerializer):
user=serializers.PrimaryKeyRelatedField(queryset=user.objects.all(),default=serializers.CurrentUserDefault())
类元:
模型=自定义目标
字段=('id'、'target_red'、'flag'、'user'、'project'、'target_amber'、'target_green'、'备注'、'metric')
def创建(自我验证的_数据):
user=validated_data.pop('user'))
project=已验证的\u data.po(“项目”)
公制=已验证的\u数据.pop('metric')
实例=CustomTarget.objects.create(
用户=用户,
项目=项目,
公制=公制,
**已验证的数据
)
return instance
我在:user=user(validated_data['user'])上的create函数中输入了什么,或者我如何通过序列化程序将用户数据保存在用户字段和其他字段中?它不起作用…我想将当前请求用户id保存在用户字段中。序列化程序create()函数中没有控件。什么都没有发生。
class CustomTargetSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), default=serializers.CurrentUserDefault())
class Meta:
model = CustomTarget
fields = ('id', 'target_red', 'flag', 'user', 'project', 'target_amber', 'target_green', 'remarks', 'metric')
def create(self, validated_data):
user = validated_data.pop('user')
project = validated_data.po('project')
metric = validated_data.pop('metric')
instance = CustomTarget.objects.create(
user=user,
project=project,
metric=metric,
**validated_data
)
return instance