fields.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import ast
  2. from nltk.tree import Tree
  3. from django.db import models
  4. class ListField(models.TextField, metaclass=models.SubfieldBase):
  5. description = "Python list"
  6. def __init__(self, *args, **kwargs):
  7. super().__init__(*args, **kwargs)
  8. def to_python(self, value):
  9. if not value:
  10. value = []
  11. if isinstance(value, list):
  12. return value
  13. return ast.literal_eval(value)
  14. def get_prep_value(self, value):
  15. if value is None:
  16. return value
  17. return str(value)
  18. def value_to_string(self, obj):
  19. value = self._get_val_from_obj(obj)
  20. return self.get_db_prep_value(value)
  21. class ListSyntacticTreeField(models.TextField, metaclass=models.SubfieldBase):
  22. description = "List of Stanford syntactic tree"
  23. def __init__(self, *args, **kwargs):
  24. super().__init__(*args, **kwargs)
  25. def to_python(self, value):
  26. if not value:
  27. value = []
  28. if isinstance(value, list):
  29. return value
  30. xs = ast.literal_eval(value)
  31. return [Tree.fromstring(x) for x in xs]
  32. def get_prep_value(self, value):
  33. if value is None:
  34. return value
  35. if isinstance(value, list):
  36. return str([str(x) for x in value])
  37. return str(value)
  38. def value_to_string(self, obj):
  39. value = self._get_val_from_obj(obj)
  40. return self.get_db_prep_value(value)