django rest framework + mariaDB: пользовательский JSONField

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

Привет, я новичок в DRF, и я боролся с полем json.

DRF не поддерживает официальный тип поля json, работающий с mariaDB, и хотя существует сторонний пакет для mysql (django-mysql), но он несовместим с mariaDB.

Итак, я поискал и начал реализовывать собственное jsonfield, и это выглядело так:

model.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)....

serializers.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)

views.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)

пожалуйста, дайте мне знать, что я делаю здесь не так, или способ использовать сторонний пакет, а не настраиваемое jsonfield

Большое спасибо и удачного дня, ребята!


person gottabegoody    schedule 16.02.2019    source источник
comment
Не могли бы вы рассказать, какие ошибки вы получаете?   -  person ruddra    schedule 17.02.2019
comment
А, я пропустил эту информацию. Я получаю сообщение «недопустимая строка» после api «POST».   -  person gottabegoody    schedule 17.02.2019


Ответы (1)


Для людей, которые страдают от такого рода проблем, я действительно решил эту проблему, но неофициально. Я установил JSONfield как текстовое поле в БД и обработал (str-> json), (json-> str) в представлении. Но опять же, это неформальный способ (я думаю), и вам понадобится другое решение, кроме этого. Если найдете, поделитесь, пожалуйста, со мной и другими людьми :)

person gottabegoody    schedule 20.02.2019