[英]What should be the foreign key that the client sends when creating a new record in a database?
我正在使用 python、fastapi 和 postgresql 制作一個 web 應用程序。數據庫中有兩個相關實體:“部門”和“用戶”,具有一對多關系:
這些是學究式的模型:
# Shared properties
class UserBase(BaseModel):
username: str | None = None
email: EmailStr | None = None
role: Roles | None = None
# Properties to receive via API on creation
class UserCreate(UserBase):
username: str
password: str
role: Roles
department_id: int # ???
因此,在應用程序中創建用戶時,必須發送指向用戶所屬部門的外鍵。 按照慣例,這個外鍵是部門的id(Pk),但是我想也許當客戶要創建一個新用戶時,他會很難記住他要關聯的部門的id它。 我該如何處理?
一種解決方案是讓客戶端指定部門名稱而不是id,然后在創建用戶之前使用該名稱在數據庫中查找部門id。
以下是如何修改 UserCreate model 以接受部門名稱而不是 id:
class UserCreate(UserBase):
username: str
password: str
role: Roles
department_name: str # instead of department_id
在用於創建用戶的 FastAPI 端點中,您可以先使用名稱查找部門 ID,然后使用該 ID 創建用戶:
@app.post("/users/", response_model=User)
async def create_user(user: UserCreate):
department = await db.fetch_one(
"""
SELECT * FROM departments WHERE name = $1
""",
user.department_name,
)
if not department:
raise HTTPException(
status_code=400, detail=f"Department {user.department_name} not found"
)
department_id = department["id"]
# create user with department_id
...
您是否偶然計划在您的 web 應用程序中使用 ORM,例如SQL Alchemy ?
如果是這樣,您可以 model 從他們的示例中找到您的解決方案。 此示例中的(許多)項目與用戶關系也可能是一個很好的指南。 與其他一些人相比,我對您的特定堆棧不太熟悉,但希望這會有所幫助。
我經常收到基於 API 的集成,我認為原始創建者實際上沒有考慮他們設計的依賴需求,代表您未來的 API 消費者 - 感謝您提前考慮到這一點:)
只是集思廣益,一般來說,當需要一個屬性時,在 API 設計中是合理的,但只要您有端點以允許您的 API 消費者查詢那些依賴實體,它是基於另一個表的查找值。 無論如何,您通常會在某種選擇列表中顯示您的部門。
我還看到開發人員依靠標簽或代碼(有點像水果和蔬菜上的 PLU 代碼)來快速創建、高度重復的 UI,用戶/員工在這些 UI 中接受過快速輸入值的培訓,並且可以輸入相關字段(在您的案例、部門),但它們在業務需求方面非常專業:比如零售庫存櫃台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.