1

Ich möchte ein created_by Feld in Django Rest Framework-Modell erstellen.Wie erstellt man ein created_by Feld im Django Rest Framework Modell?

Es sollte Benutzer_id des derzeit angemeldeten Benutzers enthalten, und es sollte so sein, dass ich es während der POST-Anfrage im JSON-Format nicht senden muss, sollte es aus der Anfrage selbst entnommen werden, wie kann ich es mit Django Rest Framework Serializer implementieren .

models.py Datei:

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) 

serializers.py Datei:

class CompanySerializer(serializers.ModelSerializer): 
"""Serializer for companies.""" 

    class Meta: 
     model = Company 
     fields = ('id', 'created_by', 'company_name') 

v1.py Datei:

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) 

Antwort

2

Methode-1: Verwendung CurrentUserDefault() Option

Sie können passieren default param Geben Sie created_by in das Feld serializers.CurrentUserDefault() ein, dessen Wert als aktueller Benutzer festgelegt wird.

class CompanySerializer(serializers.ModelSerializer): 
"""Serializer for companies.""" 

    class Meta: 
     model = Company 
     fields = ('id', 'created_by', 'company_name') 
     extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}} 

Method-2: Passing user in serializer.save()

Sie das Feld created_by als read_only eingestellt und dann request.userserializer.save() passieren.

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}} 

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) 
3

Sie können nur serializers.CurrentUserDefault() als Standard verwenden für die created_by Feld in der CompanySerializer und machen dieses Feld read_only=True.

Siehe die Dokumentation here.

0

Versuchen Sie, diese Lösung

models.py Datei

class Student(models.Model): 
    middel_name = models.CharField(max_length=100) 
    user = models.OneToOneField(User) 

hier es Datei mein Serializer ist

class GetStudentUserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id','username', 'email', 'first_name', 'last_name') 

class GetStudentSerializer(serializers.ModelSerializer): 
    user = GetStudentUserSerializer('user.username') 
    class Meta: 
     model = Student 
     fields = ('id','middel_name','user') 
     depth = 1 

    def create(self, validated_data): 
     print "hello" 
     student_data = validated_data.pop('student', None) 
     user = super(GetStudentSerializer, self).create(validated_data) 
     self.create_or_update_student(user, student_data) 
     return user 

    def update(self, instance, validated_data): 
     student_data = validated_data.pop('student', None) 
     self.create_or_update_student(instance, student_data) 
     return super(GetStudentSerializer, self).update(instance, student_data) 

    def create_or_update_student(self, user, student_data): 
     student, created = Student.objects.get_or_create(user=user, defaults=student_data) 
     if not created and student_data is not None: 
     super(GetStudentSerializer, self).update(instance, student_data) 
Verwandte Themen