Django報錯 The serializer field might be named incorrectly and not match any Got AttributeError when attempting to get a value for field `author_for` on serializer `KnownledgeBaseListSerializer`


1、問題描述,在設置,model部分字段的serialier時,出現如下報錯

字段如下:

1 # 知識庫List
2 class KnownledgeBaseListSerializer(serializers.ModelSerializer):
3     article_state = serializers.CharField(source='get_article_state_display')
4     know_classify = serializers.CharField(source='know_classify.name')
5     knowledge_source = serializers.CharField(source='knowledge_source.name',write_only=True)
6     author_for = serializers.CharField(source='author_for.name')
7     class Meta:
8         model = KnowledgeBase
9         fields = ['theme_for','article_state','know_classify','knowledge_source','author_for','create_time','average_score']

2、問題原因:

1. 當場景是前端post數據過來,調用到了serializer實例的save()方法的時候,會將字段保存入庫,但是數據庫里面沒有這個字段,所以以錯誤形式返回。解決如下:

1 def validate(self, attrs):
2     """
3     attrs : 每個字段validate之后,返回的總的字段的dict
4     """
5     del attrs["code"]
6     return attr

 

例中code就是model外的自定義字段,從序列化驗證完成后返回的attrs中刪除自定義”code”,就不會再保存這個字段

  1. 當場景為前端post數據過來進行實例創建的,比方說注冊一個賬戶或者添加一個收藏,這個過程,將會調用到createmodelmixin的create方法:
 1 class CreateModelMixin(object):
 2     """
 3     Create a model instance.
 4     """
 5     def create(self, request, *args, **kwargs):
 6         serializer = self.get_serializer(data=request.data)
 7         serializer.is_valid(raise_exception=True)
 8         self.perform_create(serializer)
 9         headers = self.get_success_headers(serializer.data)
10         return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

create最后在返回response體的時候,傳遞的參數serializer.data,其實做的是一個序列化的工作,它會依據你在class Meta里面設置的fields,去做序列化,將里面所有字段進行序列化,這個時候就會報錯

3、解決方法如下:

1 code = serializers.CharField(max_length=6,min_length=6,required=True,
2                     write_only=True,)

4、字段的write_only屬性.

Set this to True to ensure that the field may be used when updating or creating an instance, but is not included when serializing the representation.

官方文檔的說明是:設置這個屬性為true,去確保create/update的時候這個字段被用到,序列化的時候,不被用到

 

參考:https://blog.csdn.net/Newbietan/article/details/80657202


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM