Как запросить следующий вариант использования в Django? - PullRequest
0 голосов
/ 02 мая 2020

Я сделал игру, похожую на пьющую игру «Пикколо», в которой у вас есть список задач. Каждое испытание имеет переменные, которые необходимо заполнить (например: игрок X дает игроку Y четыре глотка) Кроме того, задание состоит из раундов, каждый раунд имеет указатель и описание (например, Раунд 0: X и Y пьют 4 глотка. Раунд 1: X и Y пьют 5 глотков сейчас), причем X и Y являются одинаковыми именами. в обоих раундах.

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

challenge_list = [
    Challenge(["p(0)", "rand_phone_number()"],[[0, "{d[0]} moet een nummer bellen. Het volgende scherm bepaalt welk nummer"], [1, "Het nummer is {d[1]}"]]),
    Challenge(["p(0)", "rand(2,5)", "rand_char('a','z')", "rand(2,5)"], [[0, "{d[0]} noemt {d[1]} dieren die beginnen met de letter {d[2]} of drinkt {d[3]} slokken"]]),
    Challenge([], [[0, "Alle drankjes schuiven een plek naar links"]]),

После запросов от других друзей мы решили, что было бы полезно перенести проект на Django, так как у нас не было большого опыта в веб-разработке и мы хотим узнать что-то новое. Мы придумали следующую модель для репликации жестко закодированных вызовов выше:

class Challenge(models.Model):
    pass


class Var(models.Model):
    challenge = models.ForeignKey(Challenge, on_delete=models.CASCADE)
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

class Round(models.Model):
    challenge = models.ForeignKey(Challenge, on_delete=models.CASCADE)
    index = models.IntegerField()
    description = models.CharField(max_length=100)

    def __str__(self):
        return f"[{self.index},{self.description}]"

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

Что мы ожидаем: список объектов вызова со всеми связанными переменными и раундами. Например, допустим, у нас есть следующие записи в БД

Challenge (имеет атрибут pk)

1

2

3

Vars (имеет att pk, вызов fk и имя) 1 1 "Var1"

2 1 "Var2"

3 2 "Var3"

4 3 "Var4"

5 3 "Var5"

В этом примере первая задача имеет две переменные, вторая задача имеет одну переменную, а третья задача имеет две переменные.

Rounds (имеет атрибут pk, fk для вызова, индекс, описание

1 1 0 "{Var1} и {Var2} могут говорить только по-французски"

2 1 1 "{Var1} и {Var2} могут прекрати говорить по-французски "

В этом примере задание состоит из нескольких раундов. Нажав кнопку" Следующее задание ", мы хотим получить задание, сыграть задание с индексом 0 и поместить остальные задания в очередь. .

В приведенном выше жестком примере мы создали объект вызова и жестко закодировали переменные внутри списка. Это было бы плохой практикой, если иметь число вызовы Вот почему мы хотим, чтобы наши задачи находились внутри БД.

Мы не уверены, как правильно получать вызовы из базы данных, но мы предполагаем, что одним из способов будет получение всех переменных и циклов, связанных с запросом, и поместите их в объект (чтобы он выглядел аналогично жестко закодированному примеру, за исключением того, что информация извлекается из БД, и мы можем отделить наши данные от нашей логики c).

Заранее благодарю за любую помощь и великий день :) 1045 *

Ответы [ 2 ]

1 голос
/ 02 мая 2020

В Django каждая модель (если не указано явно), которая имеет обратную связь (когда ключ объявлен в другой модели), имеет интерфейс под названием related manager , который можно использовать для построения запросов и делать поиск, ссылаясь на модель, где были определены отношения. В вашем случае, поскольку related_name не было указано в полях ForeignKey, связанный менеджер в Challenge был создан с использованием суффикса _set.

Таким образом, для запроса вызовов путем поиска var и round:

Challenge.objects.filter(var_set__name='var_example')
Challenge.objects.filter(round_set__name='round_example')

Рекомендую прочитать подробнее о том, как наборы запросов и поиск отношений работают в django;

0 голосов
/ 02 мая 2020

Похоже, ты хочешь всего? Поправь меня, если я неправильно понял.

# Get all challenges
challenges = Challenge.objects.all()

for challenge in challenges:
    # From here you have access to everything.
    # E.g. access all the rounds:
    for round in challenge.round_set.all():
        print(round.description)
    for var in challenge.var_set.all():
        print(var.name)

Итак, то, что ты хочешь, уже существует. Вы можете просто запросить вызовы и получить данные из обратных отношений. Соответствующая документация .

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