如何在Django Rest框架模型中创建created_by字段?

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)

Rah*_*pta 5

方法1:使用CurrentUserDefault()选项

您可以defaultcreated_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:传递userserializer.save()

您可以将字段设置created_byread_only,然后传递request.userserializer.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)