Получите поле внешнего ключа с помощью 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