mirror of
https://github.com/Hopiu/django-modeltranslation.git
synced 2026-05-15 00:23:08 +00:00
fix: Do not include annotation fields when selecting specific fields (#634)
This commit is contained in:
parent
f5264aa5b9
commit
defc37c7a5
2 changed files with 17 additions and 3 deletions
|
|
@ -414,8 +414,9 @@ class MultilingualQuerySet(models.query.QuerySet):
|
|||
def _values(self, *original, **kwargs):
|
||||
if not kwargs.pop('prepare', False):
|
||||
return super(MultilingualQuerySet, self)._values(*original, **kwargs)
|
||||
selects_all = kwargs.pop('selects_all', False)
|
||||
new_fields, translation_fields = append_fallback(self.model, original)
|
||||
annotation_keys = set(self.query.annotation_select.keys())
|
||||
annotation_keys = set(self.query.annotation_select.keys()) if selects_all else set()
|
||||
new_fields.update(annotation_keys)
|
||||
clone = super(MultilingualQuerySet, self)._values(*list(new_fields), **kwargs)
|
||||
clone.original_fields = tuple(original)
|
||||
|
|
@ -427,10 +428,11 @@ class MultilingualQuerySet(models.query.QuerySet):
|
|||
def values(self, *fields, **expressions):
|
||||
if not self._rewrite:
|
||||
return super(MultilingualQuerySet, self).values(*fields, **expressions)
|
||||
selects_all = not fields
|
||||
if not fields:
|
||||
# Emulate original queryset behaviour: get all fields that are not translation fields
|
||||
fields = self._get_original_fields()
|
||||
clone = self._values(*fields, prepare=True, **expressions)
|
||||
clone = self._values(*fields, prepare=True, selects_all=selects_all, **expressions)
|
||||
clone._iterable_class = FallbackValuesIterable
|
||||
return clone
|
||||
|
||||
|
|
@ -445,10 +447,11 @@ class MultilingualQuerySet(models.query.QuerySet):
|
|||
raise TypeError(
|
||||
"'flat' is not valid when values_list is " "called with more than one field."
|
||||
)
|
||||
selects_all = not fields
|
||||
if not fields:
|
||||
# Emulate original queryset behaviour: get all fields that are not translation fields
|
||||
fields = self._get_original_fields()
|
||||
clone = self._values(*fields, prepare=True)
|
||||
clone = self._values(*fields, prepare=True, selects_all=selects_all)
|
||||
clone._iterable_class = (
|
||||
FallbackFlatValuesListIterable if flat else FallbackValuesListIterable
|
||||
)
|
||||
|
|
|
|||
|
|
@ -2919,6 +2919,17 @@ class TestManager(ModeltranslationTestBase):
|
|||
id1,
|
||||
)
|
||||
|
||||
# custom annotation with fields specified
|
||||
self.assertEqual(
|
||||
list(manager.filter(id=id1).annotate(custom_id=F('id')).values_list('id'))[0],
|
||||
(id1,),
|
||||
)
|
||||
self.assertIsNone(
|
||||
list(manager.filter(id=id1).annotate(custom_id=F('id')).values('id'))[0].get(
|
||||
'custom_id'
|
||||
),
|
||||
)
|
||||
|
||||
def test_values_list_annotation(self):
|
||||
models.TestModel(title='foo').save()
|
||||
models.TestModel(title='foo').save()
|
||||
|
|
|
|||
Loading…
Reference in a new issue