Как получить значения из `ForeignKeyField`, используя peewee в запросе соединения? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть такие модели (peewee 2.10):

class LegalAct(Model):
    start_date = DateField()
    expiration_date = DateField()

class SomeModel(Model):
    name = CharField()
    legal_act = ForeignKeyField(LegalAct)

class OtherModel(Model):
    name = Charfield()
    some_model = ForeignKeyField(SomeModel) 
    starting_legal_act = ForeignKeyField(LegalAct)
    closing_legal_act = ForeignKeyField(LegalAct)

class ExtraModel(Model):
    value = IntegerField()
    other_model = ForeignKeyField(OtherModel) 
    starting_legal_act = ForeignKeyField(LegalAct)
    closing_legal_act = ForeignKeyField(LegalAct)

Учитывая список SomeModle.id с и date (для фильтрации LegalAct), я хочу получить следующие данные:

SomeModel.name
OtherModel.name
OtherModel.starting_legal_act.start_date
ExtraModel.starting_legal_act.start_date
ExtraModel.value

Проблема в том, что я не могу понять, как перейти к OtherModel.starting_legal_act.start_date и ExtraModel.starting_legal_act.start_date - я могу получить только id соответствующих моделей и извлечь данные в последующих запросах.

Мой текущий код такой:

other_model_legal_act = get_other_legal_act(date)  # a query
extra_model_legal_act = get_extra_legal_act(date)  # a query

data = OtherModel.select(
    SomeModel.name
    OtherModel.name
    OtherModel.starting_legal_act.alias('date_1')  # I get `id`, but want date
    ExtraModel.starting_legal_act.alias('date_2')  # I get `id`, but want date
    ExtraModel.value
).join(SomeModel).switch(OtherModel).join(ExtraModel).where(
    (OtherModel.legal_act == other_model_legal_act) &
    (ExtraModel.legal_act == extra_model_legal_act) &
    (SomeModel.id.in_(id_list))

)

Мне нужно заменить эти строки кодом, который будет возвращать фактические даты вместо идентификаторов записей:

OtherModel.starting_legal_act.alias('date_1')  # I get `id`, but want date
ExtraModel.starting_legal_act.alias('date_2')  # I get `id`, but want date

1 Ответ

0 голосов
/ 30 апреля 2018

Вы хотите, чтобы псевдонимы модели ссылались на LegalAct несколько раз:

LegalAct1 = LegalAct.alias()
LegalAct2 = LegalAct.alias()

data = OtherModel.select(
    SomeModel.name
    OtherModel.name
    LegalAct1.start_date.alias('date_1'),
    LegalAct2.start_date.alias('date_2'),
    OtherModel.starting_legal_act.alias('date_1')  # I get `id`, but want date
    ExtraModel.starting_legal_act.alias('date_2')  # I get `id`, but want date
    ExtraModel.value
)
.join(LegalAct1, on=(OtherModel.starting_legal_act == LegalAct.id))
.switch(OtherModel)
# 

и т.д.

В будущем ... пожалуйста, постарайтесь, чтобы ваши модели было легче рассуждать. «SomeModel» и «OtherModel» абсолютно бесполезны.

...