SQLALchemy - связь без сопоставленных внешних ключей, используя пользовательское первичное соединение с func

У меня есть две модели, и я хочу связать их (многие-ко-многим), но я не хочу использовать для этого дополнительную таблицу, потому что местоположение (свойство geom) может постоянно меняться. Я использую ST_Intersects, это функция из postgis и возвращает логическое значение, это правда, когда геометрия пересекает другую геометрию.

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.sql.functions import func
from flask import Flask
from geoalchemy2.types import Geometry

db = SQLAlchemy()

def create_app():
    app = Flask(...)
    ...
    db.init_app(app)
    ...
    return app


class City(db.Model):
    __tablename__ = "city"
    id = db.Column(db.Integer, primary_key=True)
    geom = db.Column(Geometry("POLYGON",4326))
    ...

class Location(db.Model):
    __tablename__ = "location"
    id = db.Column(db.Integer, primary_key=True)
    geom = db.Column(Geometry("POLYGON",4326))
    ...
    cities = db.relationship(City, primaryjoin=func.ST_Instesects(geom,City.geom), remote_side=id, foreign_keys=City.id, viewonly=True, uselist=True, lazy='joined') 

С этой конфигурацией выведите исключение

sqlalchemy.exc.ArgumentError: Relationship Location.cities could not determine any unambiguous local/remote column pairs based on join condition and remote_side arguments.  Consider using the remote() annotation to accurately mark those elements of the join condition that are on the remote side of the relationship.

Но если я добавлю remote() и foreign() в primaryjoin, sqlalchemy выдает одно и то же исключение

С чистого SQL я могу сделать с:

SELECT city.* FROM location loc JOIN city ON ST_Intersects(city.geom,loc.geom)

0 ответов

Другие вопросы по тегам