Ank*_*kit 5 django django-models python-2.7 django-serializer django-rest-framework
我想在Django rest框架模型中创建created_by字段。
它应该包含当前登录用户的user_id,并且应该这样,以便我在POST请求期间不需要以JSON格式发送它,应该从请求本身获取它,如何使用django rest框架序列化程序实现它。
models.py文件:
class Company(models.Model):
"""Company model for information about company."""
created_by = models.ForeignKey(User, null= True, blank= True, on_delete=models.CASCADE)
company_name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
serializers.py文件:
class CompanySerializer(serializers.ModelSerializer):
"""Serializer for companies."""
class Meta:
model = Company
fields = ('id', 'created_by', 'company_name')
Run Code Online (Sandbox Code Playgroud)
v1.py文件:
class CompanyList(APIView):
"""Get and post companies data."""
def get(self, request, format=None):
"""Get companies data.."""
companies = Company.objects.all()
serialized_companies = CompanySerializer(companies, many=True)
return Response(serialized_companies.data)
def post(self, request, format=None):
"""Post companies data."""
serializer = CompanySerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)
方法1:使用CurrentUserDefault()
选项
您可以default
在created_by
字段中传递参数,serializers.CurrentUserDefault()
该参数会将其值设置为当前用户。
class CompanySerializer(serializers.ModelSerializer):
"""Serializer for companies."""
class Meta:
model = Company
fields = ('id', 'created_by', 'company_name')
extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}}
Run Code Online (Sandbox Code Playgroud)
方法2:传递user
中serializer.save()
您可以将字段设置created_by
为read_only
,然后传递request.user
到serializer.save()
。
serializers.py
class CompanySerializer(serializers.ModelSerializer):
"""Serializer for companies."""
class Meta:
model = Company
fields = ('id', 'created_by', 'company_name')
extra_kwargs = {'created_by': {'read_only':True}}
Run Code Online (Sandbox Code Playgroud)
v1.py
class CompanyList(APIView):
"""Get and post companies data."""
def post(self, request, format=None):
"""Post companies data."""
serializer = CompanySerializer(data=request.data)
if serializer.is_valid():
serializer.save(created_by=request.user) # pass current user
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1674 次 |
最近记录: |