【问题标题】:TypeError: 'estates' is an invalid keyword argument for EstateTypeError:'estates' 是 Estate 的无效关键字参数
【发布时间】:2021-12-25 15:30:04
【问题描述】:

遇到了一个新问题,我更改了每个变量。关系有问题,并将它们插入数据库。我对在 upload_estate 函数的 routes.py 上放什么有点困惑 这里有一些新变化

models.py

class Estate(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50), nullable=False)
    quarter = db.Column(db.String(50), nullable=False)
    street = db.Column(db.String(50), nullable=False)
    price = db.Column(db.String(50), nullable=False)
    bedroom = db.Column(db.String(50), nullable=False)
    bathroom = db.Column(db.String(50), nullable=False)
    kitchen = db.Column(db.String(50), nullable=False)
    livingroom = db.Column(db.String(50), nullable=False)
    type_id = db.Column(db.Integer, db.ForeignKey('type.id'))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    estat_type = db.relationship('Type', backref=db.backref('estates', lazy=True))
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    description = db.Column(db.Text, nullable=False)
    image_file_one = db.Column(db.String(500), nullable=False)
    image_file_two = db.Column(db.String(500), nullable=False)
    image_file_three = db.Column(db.String(500), nullable=False)
    image_file_four = db.Column(db.String(500), nullable=False)
    image_file_five = db.Column(db.String(500), nullable=False)

    def __repr__(self):
        return '<Estate %r>' % self.quarter

class Type(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)

    def __repr__(self):
        return '<Type %r>' % self.name

routes.py

@app.route('/admin/upload-estate', methods=['POST', 'GET'])
@login_required
def upload_estate():
    form = UploadEstateForm()
    form.type.choices = [(type.id, type.name) for type in Type.query.all()]
    if request.method == 'POST':
        image_file_one = files.save(request.files.get('image_file_one'), name=secrets.token_hex(10) + ".")
        image_file_two = files.save(request.files.get('image_file_two'), name=secrets.token_hex(10) + ".")
        image_file_three = files.save(request.files.get('image_file_three'), name=secrets.token_hex(10) + ".")
        image_file_four = files.save(request.files.get('image_file_four'), name=secrets.token_hex(10) + ".")
        estate = Estate(
            title=form.title.data,
            quarter=form.quarter.data,
            street=form.street.data,
            price=form.price.data,
            bathroom=form.bathroom.data,
            bedroom=form.bedroom.data,
            livingroom=form.livingroom.data,
            kitchen=form.kitchen.data,
            estates=form.estate_type.data,
            user_id=current_user.id,
            description=form.description.data,
            author=current_user.username,
            image_file_one=image_file_one,
            image_file_two=image_file_two,
            image_file_three=image_file_three,
            image_file_four=image_file_four
        )
        db.session.add(estate)
        db.session.commit()
        flash('Estate uploaded successfully!', 'success')
        return redirect(url_for('dashboard'))
    return render_template('upload_estate.html', title='Upload Estate', form=form)

提前致谢

【问题讨论】:

  • 错误应该是不言自明的。 Estate 模型没有estates 列。但是您正试图用estates=form.estate_type.data 更新这个虚构的列。您应该能够通过删除提到的行来解决问题,但这最终可能无法达到您想要的结果。如果是这样,您介意解释一下TypeEstate 模型之间的关系吗?
  • Type 和 Estate 模型之间的关系是一对多的关系。我在我的数据库中的类型表中插入了数据,其中包含“id”和“name”列。我正在尝试通过 wtforms 的 SelectField 将数据从 Type 表插入到 Estate 表中
  • 您的问题格式非常个人化,不可搜索或重现,因为房地产不是编程术语,您的问题不是编程问题,而是您在编程时遇到的问题。这类问题很少受到关注和一些标记。
  • 澄清一下,你是说每张Type 桌子会有多个庄园吗?比如,每个庄园也只有一种类型?
  • 是的,如果我的问题似乎是个人问题,我很抱歉

标签: python flask sqlalchemy


【解决方案1】:

好的,您的模型设置方式表明您想要一个具有多种类型的庄园。由于情况并非如此,我建议将“estat_type”列从Estates 模型移到Type 模型中。您还需要进行如下修改:

estat_type = db.relationship('Estate', backref=db.backref('type', lazy=True))

这将允许您通过使用 Estate.type 中的 backref 'type' 来访问庄园的类型。您还可以使用Type.estat_type 访问一种类型下的所有庄园。 (我建议将 'estat_type' 更改为 'estates',因为它现在包含一个类型下的庄园列表。)

至于更新表格(如果我理解正确的话),关系会自行处理,您不需要将“类型”表中的数据插入到“庄园”表中,因为类型信息应该是可通过 backref 访问,Estate.type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多