0
0 комментариев

Как делать выборку с фильтром многие-ко-многим?
Проблемы возникают с коллекцией.

Сейчас делаю так:

Есть такой запрос:

.filter(
            User.city == current_user.city,
            User.propertys.any(Property.name.in_(['Лид', 'Контакт'])),
            ~User.contacted.any(),
            User.contacted.any(User.id == current_user.id))

в котором срабатывает либо ~User.contacted.any(), отдавая пользователей без друзей, либо же User.contacted.any(User.id == current_user.id),
отдавая пользователей, у которых друг — юзер по которому идёт выборка, но не работают вместе. Не возвращается ничего.

Один запрос перекрывает другой.

Мне нужно получить всех юзеров, у которых в контактах есть ищущий юзер, и у которых в контактах нету никого, при этом, чтобы они были в одном городе.

contacts_users = db.Table('contacts_users',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('contact_id', db.Integer, db.ForeignKey('user.id'))
)
 
class Address(Base):
    name = db.Column(db.String(50), unique=True)
    index = db.Column(db.String(50))
    city = db.Column(db.ForeignKey('city.id'))
 
 
class City(Base):
    name = db.Column(db.String(50))
    country = db.Column(db.ForeignKey('country.id'))
    addresses = db.relationship('Address',
        backref=db.backref('city'))
 
class User(Base, UserMixin):
 
    first_name = db.Column(db.String(255))
    last_name = db.Column(db.String(255))
    ...
    adresses = db.relationship('Address', secondary=addresses_users,
        backref=db.backref('users'))
    contacts = relationship(
    'User', lambda: contacts_users,
    primaryjoin=lambda: User.id == contacts_users.c.user_id,
    secondaryjoin=lambda: User.id == contacts_users.c.contact_id,
    backref='contacted'
)

Не понимаю как правильно делать.

Заранее спасибо!


Добавить комментарий