Застрял с flask SQLAlchemy отношения один ко многим самоссылки - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в flask. Я создаю свое первое веб-приложение, в котором пользователь может продавать товары, а другие пользователи могут его покупать, и будет таблица, в которой я смогу записывать эти транзакции.

У меня проблемы с проектированием базы данных с помощью flask SQLAlchemy. Я нашел пример формы, из которой я адаптировался. Пока что я получил следующее:

«Пользователь» владеет многими предметами, но «предмет» принадлежит только одному пользователю. (пользователи могут продавать много товаров) «У товара» может быть много транзакций, но транзакция рассчитана на одну продажу. (пользователи продают один и тот же товар много раз) «Пользователь» может быть продавцом или покупателем.

Не совсем уверен, правильно ли я понял, я также надеялся, что кто-нибудь сможет пролить свет на то, как я буду запрашивать я думаю, мне придется использовать запросы на соединение.

    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    full_name = db.Column(db.String(50), nullable=False)
    username = db.Column(db.String(50), unique=True, nullable=False)
    image_file = db.Column(db.String(80), nullable=False,
                           default="default.jpg")
    email = db.Column(db.String(115), unique=True, nullable=False)
    location = db.Column(db.String(50), unique=False, nullable=False)
    password_hash = db.Column(db.String(60), nullable=False)
    last_seen = db.Column(db.DateTime, default=datetime.now)

    # relationships
    items = db.relationship("Item", backref="owner", lazy=True)

    def __repr__(self):
        return f"User('{self.username}')"


class Item(db.Model):
    __tablename__ = "listings"

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), unique=False, nullable=False)
    description = db.Column(db.Text, unique=False, nullable=False)
    quantity = db.Column(db.Integer, unique=False, nullable=False, default=1)
    item_location = db.Column(db.String(50), unique=False, nullable=False)
    condition = db.Column(db.String(50), unique=False, nullable=False)
    price = db.Column(db.Float, unique=False, nullable=False)
    date_posted = db.Column(db.DateTime, default=datetime.now)
    item_views = db.Column(db.Integer, default=0)
    image_file = db.Column(db.String(20), nullable=False,
                           default='default.jpg')
    category = db.Column(db.String(50), unique=False, nullable=False)
    sold = db.Column(db.Boolean, default=False)

    # relationships
    owner_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    transac_id = db.relationship('Transaction', backref='book', lazy='dynamic')

    def __repr__(self):
        return f"Listing('{self.title}', '{self.quantity}','{self.condition}', '{self.category}', '{self.description}', '{self.created_at}', '{self.available}')"

    class Transaction(db.Model):
    """
    Transactions are created when a listed item is sold"""

    __tablename__ = "transaction"
    id = db.Column(db.Integer, primary_key=True)
    seller_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    buyer_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    listing_id = db.Column(db.Integer, db.ForeignKey(
        'listing.id'), nullable=False)
    amt_sold_for = db.Column(db.Float, nullable=False)
    bought = db.Column(db.Boolean, nullable=False)
    time_sold = db.Column(db.DateTime, default= datetime.now )
    seller = db.relationship('User',
                             primaryjoin=(seller_id == User.id),
                             backref=db.backref('seller', order_by=id))

    buyer = db.relationship('User',
                            primaryjoin=(buyer_id == User.id),
                            backref=db.backref('buyer', order_by=id)) ```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...