Использование составного поля postgres, содержащего тип географии, для использования в django ORM

Итак, у меня есть составное поле, которое я хочу использовать в своих моделях django, используя postgres в качестве БД.

CREATE TYPE address_verbose AS (

    contact_person_name string_not_null,
    mobile string_no_spaces,
    mobile_cc string_no_spaces,
    email email_with_check,
    address text,
    city text,
    state text,
    country text,
    pincode string_no_spaces,
    location geography

);

Домены string_not_null, string_no_spaces и email_with_check - это просто домены, которые я создал для проверки.

Все работает фантастически, если я использую SQL, но дело в том, что я хочу использовать это поле в моделях django и я хочу использовать Django ORM по крайней мере для создания, обновления и удаления объектов, содержащих это поле.

После некоторого поиска в Google я смог придумать пользовательское поле модели.

А минимальная модель, использующая вышеуказанное поле, имеет вид

class Shipment(models.Model):
    pickup_detail = AddressVerboseField()
    drop_detail = AddressVerboseField()

Все работает совершенно нормально при создании, обновлении или получении объекта отгрузки если я удалю поле местоположения. Но все начинает ломаться, когда вы включаете поле местоположения в AddressVerboseField. Из django doc я почерпнул идею побаловаться с get_prep_value, и я попробовал первый подход, напрямую отправив местоположение как есть в кортеже. Но это вызвало следующую ошибку.

enter image description here

Похоже, что функция адаптации из psycopg2 не смогла разобрать поле Point, поэтому подумал о том, чтобы напрямую послать SQL текст для поля Point в попытке 2. Это позволило мне приблизиться к цели, но наличие дополнительной кавычки в сгенерированном sql сломалось

enter image description here

Я довольно много искал в google об адаптации составного поля postgres к django, но все результаты не включают поля, присутствующие в postgis, в часть postgres. Это мой первый раз, когда я пишу пользовательское поле для django, поэтому я могу упустить или ошибиться в логике. Было бы очень полезно, если бы кто-нибудь помог мне в этом или указал правильное направление. Спасибо

Вернуться на верх