|
| 1 | +from django.db import models |
| 2 | + |
| 3 | +from psqlextra import HStoreField |
| 4 | +from psqlextra.expressions import HStoreRef |
| 5 | + |
| 6 | +from .fake_model import get_fake_model |
| 7 | + |
| 8 | + |
| 9 | +def test_values_hstore_key(): |
| 10 | + """Tests whether selecting only certain hstore keys using the |
| 11 | + query set's .values() method works properly.""" |
| 12 | + |
| 13 | + model_fk = get_fake_model({ |
| 14 | + 'first_name': models.CharField(max_length=255), |
| 15 | + 'last_name': models.CharField(max_length=255) |
| 16 | + }) |
| 17 | + |
| 18 | + model = get_fake_model({ |
| 19 | + 'title': HStoreField(), |
| 20 | + 'fk': models.ForeignKey(model_fk) |
| 21 | + }) |
| 22 | + |
| 23 | + fk = model_fk.objects.create(first_name='Swen', last_name='Kooij') |
| 24 | + obj = model.objects.create(title={'en': 'english', 'ar': 'arabic'}, fk=fk) |
| 25 | + |
| 26 | + # ensure that selecting only certain keys from a hstore field works |
| 27 | + result = list(model.objects.values('title__en', 'fk__first_name', 'title__ar'))[0] |
| 28 | + assert result['title__en'] == obj.title['en'] |
| 29 | + assert result['title__ar'] == obj.title['ar'] |
| 30 | + |
| 31 | + # make sure that selecting the whole hstore field works properly |
| 32 | + result = list(model.objects.values('fk__first_name', 'title'))[0] |
| 33 | + assert result['title'] == obj.title |
| 34 | + |
| 35 | + # make sure .values_list() also works properly |
| 36 | + result = list(model.objects.values_list('title__en', 'title__ar'))[0] |
| 37 | + assert result[0] == obj.title['en'] |
| 38 | + assert result[1] == obj.title['ar'] |
| 39 | + |
| 40 | + result = list(model.objects.values_list('title__en', 'title__ar'))[0] |
| 41 | + |
| 42 | + |
| 43 | +def test_annotate_hstore_key_ref(): |
| 44 | + """Tests whether annotating using a :see:HStoreRef expression |
| 45 | + works correctly. |
| 46 | +
|
| 47 | + This allows you to select an individual hstore key.""" |
| 48 | + |
| 49 | + model_fk = get_fake_model({ |
| 50 | + 'title': HStoreField(), |
| 51 | + }) |
| 52 | + |
| 53 | + model = get_fake_model({ |
| 54 | + 'fk': models.ForeignKey(model_fk) |
| 55 | + }) |
| 56 | + |
| 57 | + fk = model_fk.objects.create(title={'en': 'english', 'ar': 'arabic'}) |
| 58 | + model.objects.create(fk=fk) |
| 59 | + |
| 60 | + queryset = ( |
| 61 | + model.objects |
| 62 | + .annotate(english_title=HStoreRef('fk__title', 'en')) |
| 63 | + .values('english_title') |
| 64 | + .first() |
| 65 | + ) |
| 66 | + |
| 67 | + assert queryset['english_title'] == 'english' |
0 commit comments