-
-
Notifications
You must be signed in to change notification settings - Fork 7.1k
Closed
Description
Checklist
- Raised initially as discussion #...
- This cannot be dealt with as a third party library. (We prefer new functionality to be in the form of third party libraries where possible.)
- I have reduced the issue to the simplest possible case.
models.py
class Hanzi(AbstractBaseModel):
zi = models.CharField('汉字', max_length=1, unique=True, null=False, blank=False)
nandu = models.SmallIntegerField("难度", choices=Constant.HANZI_NANDU, null=True, blank=True)
zhuyin = models.CharField('主音', max_length=10, null=True, blank=True)
duoyininfo = JSONField('多音字', null=True, blank=True)
created_at = models.DateTimeField(verbose_name='Created at', auto_now_add=True, null=True)
modified_at = models.DateTimeField(verbose_name='Modified at', auto_now=True, null=True)
serializers.py
class HanziListSerializer(serializers.ModelSerializer):
class Meta:
model = Hanzi
fields = ['id', 'zi', 'zhuyin', 'zhuyindiao', 'nandu']
class JSONSerializerField(serializers.Field):
""" Serializer for JSONField -- required to make field writable"""
def to_representation(self, data):
print(17, data, type(data))
json_data = {}
try:
json_data = json.loads(data)
except ValueError as e:
pass
finally:
print(24, json_data, type(json_data))
return json_data
# return {'zhe': '朝~', 'zhuó': '穿~'}
def to_internal_value(self, value):
# print(29, value, type(value))
tmpvalue = json.loads(value)
# print(31, tmpvalue, type(tmpvalue))
# print(30, json.dumps(value, ensure_ascii=False), type(json.dumps(value, ensure_ascii=False)))
return json.dumps(tmpvalue)
class HanziSerializer(serializers.ModelSerializer):
duoyininfo = JSONSerializerField()
class Meta:
model = Hanzi
fields = "__all__"
views.py
class HanziViewSet(viewsets.ModelViewSet, BaseViewSetMixin):
queryset = Hanzi.objects.all()
serializer_class = HanziSerializer
filter_backends = [SearchFilter, DjangoFilterBackend]
# 模糊查询,使用单个查询参数可以对多个字段进行查询
search_fields = ['zhuyin', 'zhuyin2']
# 精准查询,一个参数对应一个字段进行过滤查询
filter_fields = ['zi']
def get_serializer_class(self):
if self.action == 'list':
return HanziListSerializer
return super(HanziViewSet, self).get_serializer_class()
# return HanziSerializer
def perform_update(self, serializer):
user = self.fill_user(serializer, 'update')
return serializer.save(**user)
def perform_create(self, serializer):
user = self.fill_user(serializer, 'create')
return serializer.save(**user)Metadata
Metadata
Assignees
Labels
No labels