รับฟิลด์คีย์ต่างประเทศโดยใช้ Peewee ORM

ฉันพยายามเลือกข้อมูลบางอย่างโดยใช้ Peewee ORM แต่ฉันสับสนว่าจะใช้คีย์ต่างประเทศอย่างไรให้ถูกต้อง

ฉันต้องการเลือก post_title, user_name, act_title โดย Act.id (คีย์หลักเริ่มต้นในการดำเนินการ)

ดังนั้นฉันจึงใช้สิ่งนี้

Post.select(Post.post_tile,User.user_name,Act.act_title).join(Act).join(User).where(Act.id==actId)

แต่ฉันได้รับสิ่งนี้: [{"post_title": null,"user": {}, "act": {}}]

นี่คือโมเดลของฉัน:

class User(BaseModel):
    user_name = CharField(max_length=30,unique=True) 
    user_email = CharField(max_length=60,unique=True) 

class Act(BaseModel):
    user = ForeignKeyField(User, related_name='users_act_id') #foreignkey
    act_title = CharField(max_length=30)

class Post(BaseModel):
    act = ForeignKeyField(Act,related_name='acts_id') #foreignkey
    user = ForeignKeyField(User,related_name='users_post_id') #foreignkey 
    post_title = CharField(max_length=30)

person Windsooon    schedule 06.08.2015    source แหล่งที่มา
comment
การใช้ตารางจำลองสำหรับชั้นเรียนของคุณ ดูเหมือนว่าการเลือกของคุณควรได้ผล คุณได้ลองทำอะไรไปแล้วถึงการดีบัก? คุณใช้ฐานข้อมูลประเภทใด? ค่าใน actId มีอยู่ใน Act หรือไม่   -  person khammel    schedule 07.08.2015
comment
ฉันใช้ Mysql และฉันได้รับ post_content: 好, user: {}, act: {} ในข้อมูล json ของฉัน   -  person Windsooon    schedule 09.08.2015


คำตอบ (2)


ฉันคิดว่าสิ่งเดียวที่คุณขาดหายไปคือการไม่ค้นหาค่าในอินสแตนซ์ที่เข้าร่วม:

posts = (Post
         .select(Post.post_tile,User.user_name,Act.act_title)
         .join(Act)
         .switch(Post)
         .join(User)
         .where(Act.id==actId))
for post in posts:
    print post.post_title, post.user.user_name, post.act.act_title

หากคุณต้องการให้แอตทริบิวต์ทั้งหมดถูกกำหนดให้กับวัตถุ post เพียงโทรไปที่ .naive() เช่น:

posts = (Post.select()...where(Act.id==actId).naive())
person coleifer    schedule 13.08.2015

หากคุณต้องการเข้าร่วมทั้งตาราง User และ Act ในตาราง Post คุณต้องใส่ สลับในแบบสอบถาม ดังนั้นคุณจะได้

Post.select(Post.post_tile,User.user_name,Act.act_title).join(Act).switch(Post).join(User).where(Act.id==actId)

แม้ว่าอาจเป็นไปได้ว่านั่นไม่ใช่ผลลัพธ์ที่คุณต้องการเนื่องจากคุณมีผู้ใช้เป็นคีย์ต่างประเทศในทั้งโมเดล Act และ Post

person ezig    schedule 07.08.2015
comment
ฉันลองแล้ว แต่ยังไม่ได้รับอะไรเลยจากผู้ใช้และดำเนินการ .... แค่ post_content: 好, ผู้ใช้: {}, ทำหน้าที่: {}.. - person Windsooon; 09.08.2015