Как вызвать метод из модели классов Django в поле Django? - PullRequest
0 голосов
/ 27 ноября 2018

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

class Task(models.Model):
    DEFAULT_VALUE     = 5
    description       = models.CharField(max_length=60)
    points            = self.total() * DEFAULT_VALUE
    STATUS            = (('A', 'Active'), ('C', 'Cancelled'), ('D', 'Done'))
    status            = models.CharField(max_length=1, choices=STATUS, default='A')

    def total(self):
        count_active = len(Task.objects.filter(status='A'))
        return count_active

В python manage.py shell Я могу создать два экземпляра Task и определить общее количество экземпляров, созданных с помощью len(Task.objects.filter(status='A'))), однако, когда я пытаюсь внедрить этот же код в функцию, я сталкиваюсь с тем, что selfнеразрешенная ссылка.Что я пропустил?

Ответы [ 4 ]

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

Решение: Запись функции , которая предоставляет значение по умолчанию для поля

<b>from django.apps import apps


def get_points():
    Task = apps.get_model(app_label='your_app_name', model_name='Task')
    return Task.objects.filter(status='A').count() * Task.DEFAULT_VALUE</b>


class Task(models.Model):
    DEFAULT_VALUE = 5
    STATUS = (('A', 'Active'), ('C', 'Cancelled'), ('D', 'Done'))
    description = models.CharField(max_length=60)
    <b>points = models.IntegerField(null=True, blank=True, default=get_points)</b>
    status = models.CharField(max_length=1, choices=STATUS, default='A')

Что ясделано здесь ??
Я создал IntegerField для хранения данных point s с параметром defaultcallable default function.

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

Как вы вызываете функцию?У меня много свойств с одинаковой структурой и все работыНо вы должны выполнить задачу.Например, у меня есть этот код:

@property
def is_expired(self):
    now = timezone.now()
    td = now - self.creation_time
    _seconds = td.total_seconds()
    validity_last = _seconds / 3600
    if validity_last < self.validity_minutes:
        return False
    return True

Чтобы вызвать его, я должен сделать экземпляр модели:

obj = ModelObject.objects.get(pk=1)
obj.is_expired()

У вас такая же структура, поэтому код выглядит нормально.

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

Использовать метод класса:

class Task(models.Model):
    ...
    @classmethod
    def total(cls, status=None):
        return cls.objects.filter(status=status).count()

Использование:

Task.total('A')
0 голосов
/ 27 ноября 2018
class Task(models.Model):
    ...
    @staticmethod
    def total():
        return len(Task.objects.filter(status='A'))

И в оболочке вы можете вызвать этот метод из класса или экземпляра: Task.total() или task = Task(*some_arguments); task.total()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...