0

Django:v2.1.5 DRF:v3.9.1 mariaDB:v10.3

嗨,我是 DRF 新手,我一直在 json 领域苦苦挣扎。

DRF 不支持与 mariaDB 一起使用的官方 json 字段类型,即使有 mysql(django-mysql) 的 3rd-party 包但与 mariaDB 不兼容。

所以我搜索并开始实现自定义 jsonfield,它看起来像:

模型.py:

class JSONField(models.TextField):
    def to_dict(self, value):
        """ convert json string to python dictionary """
        return json.loads(value)

    def to_json(self, value):
        """ convert python dictionary to json string """
        return json.dumps(value)

    def from_db_value(self, value, expression, connection):
        """ convert string from db to python dictionary """
        if value is None:
            return value
        return self.to_dict(value)

    def to_python(self, value):
        """ convert model input value to python dictionary """
        if isinstance(value, dict):
            return value
        if value is None:
            return value
        return self.to_dict(value)

    def get_prep_value(self, value):
        """ convert python dictionary to string before writing to db """
        return self.to_json(value)

class Project(models.Model):
    objects = models.Manager()
    project_user = JSONField(null=True)....

序列化程序.py:

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ('project_code'...)

    def create(self, validated_data):
        """
            Create and return a new `Project` instance, given the validated data.
        """
        return Project.objects.create(**validated_data)

视图.py:

class ListCreateProjectView(APIView):

    """
    POST admin/_proj_/

        : create a project 
    """
    def post(self, request, format=None):
        serializer = ProjectSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(data=serializer.data)
        else:
            return Response(data=serializer.errors)

请让我知道我在这里做错了什么或使用 3rd 方包而不是自定义 jsonfield 的方法

非常感谢,祝你们有美好的一天!

4

1 回答 1

0

对于遭受这种问题困扰的人,我实际上解决了这个问题,但是以一种非正式的方式。我将 JSONfield 设置为 DB 中的文本字段,并在视图中处理 (str->json),(json->str)。但同样,这是一种非正式的方式(我认为),您将需要另一种解决方案。如果你找到了,请分享给我和其他人:)

于 2019-02-20T18:02:21.090 回答