Hi James, yup, that's right. And I certainly have done that automatic
transform for the WHERE part of the query. However it's the SELECT part
that doesn't have any hooks. But Kuba's suggestion of writing a custom
backend will. Though because it's just an optimisation I think I can leave
it for now. It's just nice to know that it's available.

Cheers

h

On Fri, Oct 27, 2017 at 4:18 PM, James Cheese <tr...@tr00st.co.uk> wrote:

> Hi Hansel,
>
> Might be missing the point, but... If you're looking to reference the
> individual fields, can you leverage the Postgres JsonField's key lookup
> functionality? As per https://docs.djangoproject.com/en/1.11/ref/
> contrib/postgres/fields/#key-index-and-path-lookups
>
> A quick bit of code inspection appears to show Django's ORM assembling the
> necessary SQL for you:
> https://github.com/django/django/blob/b29c6c96c738bd7250a408b079dd8a
> 4d4657849a/django/contrib/postgres/fields/jsonb.py#L90
>
> At very least, this might give you somewhere to start from - eg: wrapping
> this capability, or implementing your own get_transform for the field may
> allow you to build the JSON paths manually if you're finding it's not
> suitable.
>
> Hope that helps...
>
> James
>
> On Fri, 27 Oct 2017 at 05:43 Hansel Dunlop <han...@interpretthis.org>
> wrote:
>
>> Thank you Kuba! That's interesting. Good to know it's possible . If not,
>> perhaps, advisable. I imagine my translated fields could register the
>> models they're on and "as_sql" could do a quick lookup to see if we were
>> referencing any of them in the particular query.
>>
>> I have looked at existing alternatives. In fact we're using
>> django-modeltranslation currently. The API of which I think is great. But I
>> don't want to continue to scale it because of the number of extra columns
>> it's adding to the database and the size and ugliness of the queries it's
>> generating. If we have a model with 10 translated fields and 160 translated
>> languages we would have just hit postgresql's 1600 column limit and the
>> queries themselves would be > 10KB. Not to mention the number of extra
>> database migrations we would have generated to get there.
>>
>> The APIs for django-hvad and django-parler both seem to have slightly
>> different goals. I want to completely avoid talking about translations in
>> my general code. Set the language for a request once based on the headers
>> it provides. And return an api response where any localised fields are
>> provided in that language without modifying any view or serializer code.
>>
>> I have a custom TranslatedField that achieves these goals, quite simply.
>> And it's good to know I can make further optimisations to it should I need
>> to.
>>
>>
>> On Fri, Oct 27, 2017 at 12:03 AM, Kuba <kuba.janos...@gmail.com> wrote:
>>
>>> Hi Hansel,
>>>
>>>
>>> On 26 October 2017 at 18:52, Hansel Dunlop <han...@interpretthis.org>
>>> wrote:
>>>
>>>> Hi all,
>>>>
>>>> So I just got a notification from Stackoverflow that this question -
>>>> https://stackoverflow.com/questions/46804936/custom-
>>>> django-field-type-with-modified-column-look-up-in-select-part - was
>>>> just awarded the tumbleweed badge (no, votes, no answers, and no views)...
>>>>
>>>
>>>> So throwing this open to the wider community here. I do suspect there
>>>> is no way of doing this in Django. But I wish there was. Because I'm trying
>>>> to create a custom translation infrastructure and it would help if I could
>>>> just return the actual text in the query rather than the whole blob of 
>>>> json.
>>>>
>>>
>>>
>>> so just regarding this part: *Does Django have any hooks that let me
>>> dynamically change the 'SELECT' part of the query?*
>>>
>>> Writing custom SQL backend (with only one custom part - the compiler)
>>> would be one relatively "easy" way to do that. As weird as it sounds it
>>> would take one method to override and mess up with.
>>> django.db.models.sql.compiler.SQLCompiler.as_sql is your friend. You'd
>>> need to find a clever way to figure out if given compiled sql query is the
>>> one you're interested in and only then alter it, to avoid performance
>>> penalties. I'm not sure it's a good idea, but it is possible. Of course
>>> it's quite deep in internals so passing any custom stuff there would be
>>> anyway kinda "threadlocal-magical".
>>>
>>> Regarding translations, just curious: have you considered django-hvad /
>>> django-parler?
>>>
>>> Cheers,
>>> Jakub
>>>
>>>
>>>
>>>>
>>>> I mean maybe I could on the fly modify the db_column value. But would
>>>> that be thread safe? Doubt it.
>>>>
>>>> --
>>>>
>>>>                                 Hansel
>>>>
>>>> _______________________________________________
>>>> python-uk mailing list
>>>> python-uk@python.org
>>>> https://mail.python.org/mailman/listinfo/python-uk
>>>>
>>>>
>>>
>>> _______________________________________________
>>> python-uk mailing list
>>> python-uk@python.org
>>> https://mail.python.org/mailman/listinfo/python-uk
>>>
>>>
>>
>>
>> --
>>
>>                                 Hansel
>> _______________________________________________
>> python-uk mailing list
>> python-uk@python.org
>> https://mail.python.org/mailman/listinfo/python-uk
>>
>
> _______________________________________________
> python-uk mailing list
> python-uk@python.org
> https://mail.python.org/mailman/listinfo/python-uk
>
>


-- 

                                Hansel
_______________________________________________
python-uk mailing list
python-uk@python.org
https://mail.python.org/mailman/listinfo/python-uk

Reply via email to