Определение метода свойства в Django с помощью ForeignKey - PullRequest
0 голосов
/ 17 июня 2020

Я работаю со своим приложением Django, в котором у меня две модели: Store и Turn. Существует отношение «один ко многим», когда у магазина много ходов, которые необходимо обработать. Это код:

class Store(models.Model):
    name = models.CharField(max_length=20)
    adress = models.CharField(max_length=40)
    image = models.ImageField(upload_to=)

    @property
    def average_wait_time(self):
        return #here's the problem

    def __str__(self):
        return self.name


class Turn(models.Model):
    store = models.ForeignKey(Store, on_delete=models.SET_NULL, null=True)
    creation_time = models.TimeField(auto_now=True)
    completion_time = models.TimeField(blank=True, null=True)

    def complete(self):
        self.completion_time = timezone.now()

    def __str__(self):
        return f'Turno a las {creation_time} para el Negocio {completion_time}'

Как видите, у меня есть метод @property, который мне нужно использовать, чтобы рассчитать среднее время ожидания в магазине, определяемое средним значением очереди. длительности. Как я могу заставить это работать? Я не могу получить доступ к модели Turn из модели Store ...

1 Ответ

1 голос
/ 17 июня 2020

related_name

Вам нужен аргумент related_name в ForeignKey. Он работает следующим образом:

store = models.ForeignKey(Store, on_delete=models.SET_NULL, null=True, related_name="turns")

Это означает, что теперь вы можете получить доступ ко всем ходам конкретного магазина следующим образом:

store = Store.objects.get(id=1)  # get a store
turns = store.turns

turns в приведенном выше будет набором запросов из Turn объектов.

Также обратите внимание, что если вы не укажете related_name django фактически создаст его автоматически, добавив _set в конец имени связанной модели в нижнем регистре, и вы можете сделать то же самое со следующим:

turns = store.turn_set

Но, вероятно, лучше явно указать related_name.

Ваш конкретный случай

class Store(models.Model):
    ...

    @property
    def average_wait_time(self):
        turns = self.turns
        total_time = sum([turn.completion_time - turn.creation_time for turn in turns.all()])
        average_time = total_time / turns.count()
        return average_time

Вы также можете сделать это, используя aggregate и Avg, но приведенное выше, вероятно, подходит.

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