SQLAlchemy - один-к-одному и один-ко-многим с одной и той же таблицей - PullRequest
0 голосов
/ 05 февраля 2020

Скажем, у меня есть две модели, Автомобиль и Человек:

class Car(db.Model):
        ...

class Person(db.Model):
        car_id = db.Column(db.Integer, db.ForeignKey('car.id'))
        car = db.relationship("Person", backref='passengers')

Отношения Person -> Car являются отношениями "многие к одному", потому что в машине может быть несколько человек. Я хочу добавить водителя в машину. Драйвер также Person, но в отношениях один к одному.

class Car(db.Model):
    driver_id = db.Column(db.Integer, db.ForeignKey('person.id'))
    driver = db.relationship("Car", backref=backref('person', uselist=False)

Если бы я сделал это таким образом, я получил бы ошибку, что Person.car уже существует.

Мне нужно следующее поведение:

  1. Когда установлено Car.driver, для Person.car должно быть установлено значение Car (автоматически или вручную).
  2. Когда установлено Person.car, с Car ничего не должно произойти, поскольку Car не знает, является ли Person driver или passenger.
  3. Car.passengers не содержит driver.
  4. Person должен иметь только один внешний ключ для Car

Я пробовал различные комбинации backref и back_populates, включая не используя ни Я думаю, что это сработало бы, если бы я мог указать passengers массив внешних ключей для объекта Car, но я не думаю, что это возможно.

Есть ли способ определить эти отношения?

...