рамки отдыха django + mariaDB: пользовательские JSONField - PullRequest
0 голосов
/ 17 февраля 2019

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

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

1 Ответ

0 голосов
/ 20 февраля 2019

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

...