Peewee ORM: выбор на основе атрибутов полей внешнего ключа (обратных ссылок) - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь сделать выборку на основе значений в полях внешнего ключа.

Мои модели выглядят так:

class Domain(BaseModel):
domain_check_time = DateTimeField()
domain_name = CharField()
domain_health = BooleanField()
domain_registration_expiry_date = DateField()
domain_registration_expiry_health = BooleanField()
domain_ssl_issuer_cn = CharField()
domain_ssl_expiry_date = DateField()
domain_ssl_expiry_health = BooleanField()
domain_mxtoolbox_health = BooleanField(null = True)

class MXToolboxReport(BaseModel):
    domain = ForeignKeyField(Domain, backref = 'mxtoolbox_reports', null = True)
    command = CharField()
    response = TextField()

class MXToolboxBatch(BaseModel):
    mxtoolbox_batch_time = DateTimeField()
    domain = ForeignKeyField(Domain, backref = 'mxtoolbox_batch', null = True)
    report = ForeignKeyField(MXToolboxReport, backref = 'mxtoolbox_batch', null = True)

Я пытаюсь вернуть N доменов на основе mxtoolbox_batch_timeатрибут для самого последнего mxtoolbox_batch_time.

Я пытаюсь придумать логику для этого с помощью циклов for, но у меня возникают проблемы - я также подозреваю, что есть более элегантный способ.

Это приближение, которое я могу придумать (псевдокод):

domains = Domain.select()

newest_batches = MXToolboxBatch.Select.limit(0)

for domain in domains:
    newest_batch = MXToolboxBatch.select().where(MXToolboxBatch.domain == domain).order_by(MXToolboxBatch.id.desc()).get()
    newest_batches += newest_batch

Domain.select().join(newest_batches).order_by(MXToolboxBatch.mxtoolbox_batch_time.desc()).limit(25)

1 Ответ

0 голосов
/ 30 ноября 2018

Вместо циклического обхода доменов, почему бы не узнать, какой MXToolboxBatch является самым последним (т.е. max (mxtoolboxbatch_batch_time)).Затем присоединитесь к доменам и MXToolboxBatch на основе этого результата.В uber -псевдо-код:

newest_batch_is = MXToolboxBatch.Select(fn.MAX(mxtoolboxbatch_batch_time))

result_is = Domain.Select().join(MXToolboxBatch).where(MXToolboxBatch.batch_time = newest_batch_is).limit(N)
...