Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Python Build a Social Network with Flask Broadcasting Post Model

Joseph Anderson
Joseph Anderson
10,617 Points

Post Model challenge issue with ForeignKeyField

So the challenge wants me to to create a ForeignKeyField called user related to the User model with the related_name set to "orders"

This is what I have written

class LunchOrder(Model):
    order = TextField()
    date = DateField()
    user = ForeignKeyField(
        rel_model=User,
        related_name="orders"
    )

It matches the video and the peewee documentation (I even tried it with the "rel_model=" removed) But it tells me that Task 1 is no longer passing. If i remove everything starting with "user" and after, I get the "no user field" error.

If I add user = TextField()

I get a "no user field" error again. Then, if I try just user = ForeignKeyField() I get the Task 1 no longer passing.

Do I need to import something to get ForeignKeyField to work? Do I have a typo I'm missing? Thanks!

2 Answers

Hanley Chan
Hanley Chan
27,771 Points

Hi,

Your code should work if you put your class under the user class.

Trike Whipcat
Trike Whipcat
12,726 Points

I also had this problem and came to this post for help. What Hanley means is that the LunchOrder class must be placed after the User class, otherwise the interpreter tries to reference something before it's assigned. 'Under' was a little too ambiguous for me at first, "placed below", "come after", or "placed after" would have been clearer for me. Here's how the code should look:

import datetime

from flask.ext.bcrypt import generate_password_hash
from flask.ext.login import UserMixin
from peewee import *

DATABASE = SqliteDatabase(':memory:')


class User(UserMixin, Model):
    email = CharField(unique=True)
    password = CharField(max_length=100)
    join_date = DateTimeField(default=datetime.datetime.now)
    bio = CharField(default='')

    class Meta:
        database = DATABASE

    @classmethod
    def new(cls, email, password):
        cls.create(
            email=email,
            password=generate_password_hash(password)
        )

class LunchOrder(UserMixin, Model):
    order = TextField()
    date = DateField()
    user = ForeignKeyField(
        rel_model=User,
        related_name="orders"
    )

def initialize():
    DATABASE.connect()
    DATABASE.create_tables([User], safe=True)
    DATABASE.close()