Более эффективный способ проверить, что нет связанного элемента, который имеет определенное значение - PullRequest
0 голосов
/ 11 января 2020

У меня есть следующий метод в одном из моих классов моделей. Он разработан, чтобы мои взгляды знали, что JournalEntry можно редактировать. Он должен возвращать true, если запись не старше 90 дней и не имеет каких-либо связанных LineItems, которые имеют значение в поле LineItems reconciled_date. Ie все связанные элементы LineItems должны иметь значение NULL в своем поле reconciled_date.

Метод работает, но выполняет итерации через элементы LineItems, что представляется очень неэффективным. Есть ли лучший способ?

Models.py

class JournalEntry(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=False, blank=False)
    date = models.DateField(null=False, blank=False)
    def can_edit(self):
        """Checks if logged user can edit"""
        is_reconciled = 0
        for lineitem in self.lineitem_set.all():
            if lineitem.reconciliation_date != None:
                is_reconciled = 1
        if (datetime.date.today() < (self.date + datetime.timedelta(90))) and is_reconciled == 0:
            return True
        else:
            return False

Спасибо

1 Ответ

1 голос
/ 11 января 2020

Вы можете выполнить один запрос, который определяет, есть ли у JournalEntry какие-либо связанные позиции с ненулевым значением recciliation_date. Было бы удобно иметь это в свойстве, если вы хотите использовать его в других методах

@property
def is_reconciled(self):
    """Returns True if any related line items have a non-null reconciliation_date"""
    return self.lineitem_set.filter(reconciliation_date__isnull=False).exists()

Тогда вы можете использовать это в своем методе

def can_edit(self):
    """Checks if logged user can edit"""
    # First check if the entry is less than 90 days old as it does not require
    # a call to the DB
    if self.date > datetime.date.today() - datetime.timedelta(days=90):
        # If the entry is less than 90 days old then we return the inverse of is_reconciled
        return not self.is_reconciled
     return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...