Рамки для отдыха django + mariaDB: пользовательский JSONField
Джанго: v2.1.5 DRF: v3.9.1 mariaDB: v10.3
Привет, я новичок в DRF, и я боролся с JSON Field.
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 ответ
Для людей, которые страдают от такого рода проблем, я на самом деле решил эту проблему, но неформально. Я устанавливаю JSONfield как текстовое поле в БД и обрабатываю (str->json),(json->str) в представлении. Но опять же, это неформальный способ (я думаю), и вам понадобится другое решение, чем это. Если вы найдете один, пожалуйста, поделитесь им для меня и других людей:)