2017-01-30 85 views
0

我目前使用restful和serializers來創建和更新我的用戶。 不知何故,如果該字段與OneToOneField/ForeignKey有關,我無法更新某些字段。如何使用ViewSet更新OneToOneField/ForeignKey? Django

在我的models.py

,我的學生實際上連接到Django的建立用戶模型,其中包括用戶的電子郵件,並連接到具有學校

class Student(Model): 
    user = OneToOneField(settings.AUTH_USER_MODEL, on_delete=CASCADE) 

    date_of_birth = DateField(blank=True, null=True) 

    student_name = CharField(max_length=256) 
    school = ForeignKey(School, 
         on_delete=CASCADE, 
         related_name="%(class)ss", 
         related_query_name="%(class)s", 
         blank=True, 
         null=True) 
在串行

的名義辦學模式。 PY我

class StudentSerializer(ModelSerializer): 
    user_email = SerializerMethodField() 
    school_name = SerializerMethodField() 

    class Meta: 
     model = Student 
     fields = (
      'user_email', 'student_name', 'phone', 'school_name') 

    def get_user_email(self, obj): 
     return obj.user.email 

    def get_school_name(self, obj): 
     return obj.school.school_name 

    def create(self, validated_data): 
     return Student.objects.create(**validated_data) 

    def update(self, instance, validated_data): 
     instance.user.email = validated_data.get('user_email', instance.user.email) 
     instance.student_name = validated_data.get('student_name', instance.student_name) 
     instance.phone = validated_data.get('phone', instance.phone) 
     instance.school.school_name = validated_data.get('school_name', instance.school.school_name) 
     instance.save() 
     return instance 

我view.py更新功能

class UserViewSet(ViewSet): 
    queryset = Student.objects.all() 

    def update(self, request, pk=None): 
     student = get_object_or_404(self.queryset, pk=pk) 
     serializer = StudentSerializer(student, data=request.data, partial=True) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response({'status': True}) 
     return Response({'status': False, 'message': serializer.errors}) 

我我能夠使用API​​視圖來傳遞json並更新student_namephone,但對於另外兩個user_emailschool_name我無法更新它。當我提交json時,我沒有收到任何錯誤輸出。

我意識到我無法更新的兩個字段是因爲它們是OneToOneField/ForeignKey。

有人可以給我一隻手我在這裏失蹤或我可以做什麼檢查?

在此先感謝

+0

'instance..school.school_name',你只是在這個計算器或腳本錯字繼續? –

+0

@SancaKembang in stackoverflow:P – Dora

回答

0

由於您使用的SerializerMethodField這是隻讀域(docs)USER_EMAILschool_name所以他們不會在validated_data可用。

你檢查你validated_data收到的數據

def update(self, instance, validated_data): 
    print('++'*22, validated_data) 
    return instance 
0

我覺得你的序列化沒有完成......的userschool領域的實例模型,你需要在特定領域的序列化器來實現實例模型,例如:使用source='...'參數。

和示例:

class VoteSerializer(serializers.ModelSerializer): 
    # by `username` 
    user = serializers.CharField(
     source='user.username', 
     read_only=True 
    ) 
    # by `pk/id` 
    candidate = serializers.IntegerField(
     source='candidate.pk', 
     read_only=True 
    ) 

    class Meta: 
     model = Vote 
     fields = ('user', 'candidate', 'score') 

    def create(self, validated_data): 
     return Vote.objects.create(**validated_data) 

,並在你的情況,也許是這樣的;

class StudentSerializer(ModelSerializer): 
    # by `pk/id` from the user 
    user = serializers.IntegerField(
     source='user.pk', 
     read_only=True 
    ) 
    school = serializers.IntegerField(
     source='school.pk', 
     read_only=True 
    ) 
+0

我剛剛嘗試過這一點,當然我需要使用'user_email'和'EmailField',而不是你應該做的,但仍然沒有運氣。嘗試更新它時我沒有遇到任何錯誤 – Dora

相關問題