How Do I fix these Code?

0 comments

I got this error when I run my code.

"sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship TopCities.posts - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression."

 Here is my code:
 
models.py

from app import db
from datetime import datetime

class TopCities(db.Model):
    #create column for database
    #primary_key means it is unique
    id = db.Column(db.Integer, primary_key=True)
    city_name= db.Column(db.String(64), unique=True, index=True)
    city_rank = db.Column(db.Integer())
    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return f'{self.city_name} with rank {self.city_rank}'

class Post(db.Model):
    #create column for database
    #primary_key means it is unique
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(256))
    timestamp = db.Column(db.DateTime, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('TopCities.id'))

    def __repr__(self):
        return f'<Post> {self.id}: {self.body}>'

routes.py

from app import app_obj
from app.forms import TopCities
from flask import render_template, flash, redirect
from app import db
from app.models import TopCities, Post

@app_obj.route("/login", methods = ['GET','POST'])
def login():
    name = 'Khuong'
    title = 'Top Cities'
    top_cities = TopCities.query.all()
    form = TopCities()
    if form.validate_on_submit():
    top_cities = Topcities.query.all(city_name=form.city_name.data)
        if top_cities is None or not top_cities.check_city_rank(form.city_rank.data):
            flask('Invalid city_name or city_rank')
        else:
            top_cities = TopCities(city_name = form.city_name.data, city_rank = form.city_rank.data)
            db.sesion.add(top_cities)
            db.session.commit()
            flask('New city is added!')
            return redirect('/')
 return render_template("home.html", name=name, title=title, form=form)

__init__.py

import flask
import os
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
#instance of the flask class
app_obj = flask.Flask(__name__)
app_obj.config.from_mapping(
    SECRET_KEY = 'it-dont-matter',
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db'),
    SQLALCHEMY_TRACK_MODIFICATIONS = False
)
db = SQLAlchemy(app_obj)
from app import routes, models
 

forms.py from flask_wtf import FlaskForm from wtforms import StringField, IntegerField, BooleanField, SubmitField from wtforms.validators import DataRequired class TopCities(FlaskForm): city_name = StringField('City Name',validators=[DataRequired()]) city_rank = IntegerField('City Rank',validators=[DataRequired()]) is_visited = BooleanField('Visited') submit = SubmitField('Submit') base.html <!DOCTYPE html> <html> <head> {% if title %} <title>{{title}}!</title> {% else %} <title>Home</title> {% endif %} </head> <body> {% with messages = get_flashed_messages() %} {% if messages %} <ul> {% for m in message %} <li>{{ m }}</li> {% endfor %} </ul> {% endif %} {% endwith %} {% block content %} {% endblock %} </body> </html> home.html {% extends "base.html" %} {% block content %} <h1> Welcomee {{name}}, here are top destinations! </h1> <a href="https://www.google.com">goooogle</a> <ul> {% for city in top_cities %} <li>{{ city }}</li> {% endfor %} </ul> <form method="POST" novalidate> {{ form.hidden_tag() }} <p> {{ form.city_name.label }} <br> {{ form.city_name(size=40) }}</p> <p> {{ form.city_rank.label }} <br> {{ form.city_rank(size=40) }}</p> <p> {{ form.is_visited.label }} <br> {{ form.is_visited() }}</p> <p> {{ 'Submit' + form.submit() }}</p>

About the Author

Follow me


{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}