Skip to content

Commit b33e7b7

Browse files
50 - Foreign Key Relationships & The Models Module
1 parent 6ff9209 commit b33e7b7

File tree

11 files changed

+100
-113
lines changed

11 files changed

+100
-113
lines changed

full_stack_python/auth/__init__.py

-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +0,0 @@
1-
from .models import UserInfo
2-
3-
4-
__all__ = [
5-
'UserInfo',
6-
]

full_stack_python/auth/models.py

-30
This file was deleted.

full_stack_python/auth/state.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import sqlmodel
55

6-
from .models import UserInfo
6+
from ..models import UserInfo
77

88

99

full_stack_python/blog/__init__.py

-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22
from .detail import blog_post_detail_page
33
from .edit import blog_post_edit_page
44
from .list import blog_post_list_page
5-
from .model import BlogPostModel
65
from .state import BlogPostState
76

87
__all__= [
98
'blog_post_add_page',
109
'blog_post_detail_page',
1110
'blog_post_edit_page',
1211
'blog_post_list_page',
13-
'BlogPostModel',
1412
'BlogPostState'
1513
]

full_stack_python/blog/list.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
from .. import navigation
44
from ..ui.base import base_page
5+
from ..models import BlogPostModel
6+
from . import state
57

6-
from . import state, model
7-
8-
def blog_post_detail_link(child: rx.Component, post: model.BlogPostModel):
8+
def blog_post_detail_link(child: rx.Component, post: BlogPostModel):
99
if post is None:
1010
return rx.fragment(child)
1111
post_id = post.id
@@ -18,7 +18,7 @@ def blog_post_detail_link(child: rx.Component, post: model.BlogPostModel):
1818
href=post_detail_url
1919
)
2020

21-
def blog_post_list_item(post: model.BlogPostModel):
21+
def blog_post_list_item(post: BlogPostModel):
2222
return rx.box(
2323
blog_post_detail_link(
2424
rx.heading(post.title),

full_stack_python/blog/model.py

-37
This file was deleted.

full_stack_python/blog/state.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from sqlmodel import select
66

77
from .. import navigation
8-
from .model import BlogPostModel
8+
from ..models import BlogPostModel
99

1010
BLOG_POSTS_ROUTE = navigation.routes.BLOG_POSTS_ROUTE
1111
if BLOG_POSTS_ROUTE.endswith("/"):

full_stack_python/contact/model.py

-25
This file was deleted.

full_stack_python/contact/page.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import reflex as rx
2-
3-
from ..auth.state import SessionState
4-
from .. import navigation
52
from ..ui.base import base_page
3+
from ..models import ContactEntryModel
4+
from . import form, state
65

7-
from . import form, state, model
8-
9-
def contact_entry_list_item(contact: model.ContactEntryModel):
6+
def contact_entry_list_item(contact: ContactEntryModel):
107
return rx.box(
118
rx.heading(contact.first_name),
129
rx.text("Message:", contact.message),

full_stack_python/contact/state.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import reflex as rx
44

55
from sqlmodel import select
6-
from .model import ContactEntryModel
6+
77

88
from ..auth.state import SessionState
9+
from ..models import ContactEntryModel
910

1011
class ContactState(SessionState):
1112
form_data: dict = {}

full_stack_python/models.py

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
from typing import Optional, List
2+
from datetime import datetime
3+
import reflex as rx
4+
from reflex_local_auth.user import LocalUser
5+
6+
import sqlalchemy
7+
from sqlmodel import Field, Relationship
8+
9+
from . import utils
10+
11+
class UserInfo(rx.Model, table=True):
12+
email: str
13+
user_id: int = Field(foreign_key='localuser.id')
14+
user: LocalUser | None = Relationship() # LocalUser instance
15+
posts: List['BlogPostModel'] = Relationship(
16+
back_populates='userinfo'
17+
)
18+
contact_entries: List['ContactEntryModel'] = Relationship(
19+
back_populates='userinfo'
20+
)
21+
created_at: datetime = Field(
22+
default_factory=utils.timing.get_utc_now,
23+
sa_type=sqlalchemy.DateTime(timezone=True),
24+
sa_column_kwargs={
25+
'server_default': sqlalchemy.func.now()
26+
},
27+
nullable=False
28+
)
29+
updated_at: datetime = Field(
30+
default_factory=utils.timing.get_utc_now,
31+
sa_type=sqlalchemy.DateTime(timezone=True),
32+
sa_column_kwargs={
33+
'onupdate': sqlalchemy.func.now(),
34+
'server_default': sqlalchemy.func.now()
35+
},
36+
nullable=False
37+
)
38+
39+
40+
class BlogPostModel(rx.Model, table=True):
41+
# user
42+
# id: int -> primary key
43+
userinfo_id: int = Field(default=None, foreign_key="userinfo.id")
44+
userinfo: Optional['UserInfo'] = Relationship(back_populates="posts")
45+
title: str
46+
content: str
47+
created_at: datetime = Field(
48+
default_factory=utils.timing.get_utc_now,
49+
sa_type=sqlalchemy.DateTime(timezone=True),
50+
sa_column_kwargs={
51+
'server_default': sqlalchemy.func.now()
52+
},
53+
nullable=False
54+
)
55+
updated_at: datetime = Field(
56+
default_factory=utils.timing.get_utc_now,
57+
sa_type=sqlalchemy.DateTime(timezone=True),
58+
sa_column_kwargs={
59+
'onupdate': sqlalchemy.func.now(),
60+
'server_default': sqlalchemy.func.now()
61+
},
62+
nullable=False
63+
)
64+
publish_active: bool = False
65+
publish_date: datetime = Field(
66+
default=None,
67+
sa_type=sqlalchemy.DateTime(timezone=True),
68+
sa_column_kwargs={},
69+
nullable=True
70+
)
71+
72+
73+
74+
class ContactEntryModel(rx.Model, table=True):
75+
user_id: int | None = None
76+
userinfo_id: int = Field(default=None, foreign_key="userinfo.id")
77+
userinfo: Optional['UserInfo'] = Relationship(back_populates="contact_entries")
78+
first_name: str
79+
last_name: str | None = None
80+
email: str | None = None # = Field(nullable=True)
81+
message: str
82+
created_at: datetime = Field(
83+
default_factory=utils.timing.get_utc_now,
84+
sa_type=sqlalchemy.DateTime(timezone=True),
85+
sa_column_kwargs={
86+
'server_default': sqlalchemy.func.now()
87+
},
88+
nullable=False
89+
)

0 commit comments

Comments
 (0)