Skip to content

Commit

Permalink
Fixed HalfVectorField forms for Django - fixes #75
Browse files Browse the repository at this point in the history
  • Loading branch information
ankane committed Jun 12, 2024
1 parent 0686c58 commit 1e2006a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
20 changes: 20 additions & 0 deletions pgvector/django/halfvec.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django import forms
from django.db.models import Field
from ..utils import HalfVector

Expand Down Expand Up @@ -38,3 +39,22 @@ def get_prep_value(self, value):

def value_to_string(self, obj):
return self.get_prep_value(self.value_from_object(obj))

def formfield(self, **kwargs):
return super().formfield(form_class=HalfVectorFormField, **kwargs)


class HalfVectorWidget(forms.TextInput):
def format_value(self, value):
if isinstance(value, HalfVector):
value = value.to_list()
return super().format_value(value)


class HalfVectorFormField(forms.CharField):
widget = HalfVectorWidget

def to_python(self, value):
if isinstance(value, str) and value == '':
return None
return super().to_python(value)
6 changes: 2 additions & 4 deletions tests/test_django.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,7 @@ def test_halfvec_form_instance(self):
Item(id=1, half_embedding=[1, 2, 3]).save()
item = Item.objects.get(pk=1)
form = HalfVectorForm(instance=item)
# TODO fix
# assert 'value="[1.0, 2.0, 3.0]"' in form.as_div()
assert 'value="[1.0, 2.0, 3.0]"' in form.as_div()

def test_halfvec_form_save(self):
Item(id=1, half_embedding=[1, 2, 3]).save()
Expand All @@ -342,8 +341,7 @@ def test_halfvec_form_save_missing(self):
item = Item.objects.get(pk=1)
form = HalfVectorForm(instance=item, data={'half_embedding': ''})
assert form.is_valid()
# TODO fix
# assert form.save()
assert form.save()
assert Item.objects.get(pk=1).half_embedding is None

def test_bit_form(self):
Expand Down

0 comments on commit 1e2006a

Please sign in to comment.