Попытка получить две случайные выборки с одинаковым значением внешнего ключа
программист-нуби здесь. Я работаю над приложением на django, которое создает случайные имена фэнтезийных персонажей, которые берутся из следующих моделей:
``
class VillagerFirstNames(models.Model):
first_name=models.CharField(max_length=30, unique=True)
race = models.ForeignKey(Race, on_delete=models.CASCADE)
def __str__(self):
return self.first_name
class VillagerLastNames(models.Model):
last_name = models.CharField(max_length=30, unique=True)
race = models.ForeignKey(Race, on_delete=models.CASCADE)
def __str__(self):
return self.last_name
`` Моя проблема возникает в моих Представлениях. Чтобы извлечь случайную выборку, я должен преобразовать свой запрос в список следующим образом:
``
foreign_first = list(VillagerFirstNames.objects.all()
foreign_first_random = random.sample(foreign_first, 3)
context["foreign_first"] = foreign_first_random
foreign_last = list(VillagerLastNames.objects.filter(race__race=foreign_first_random.race))
context["foreign_last"] = random.sample(foreign_last, 3)
`` В принципе, я хочу, чтобы выбранные фамилии были той же расы, что и фамилии, выбранные в первой случайной выборке. У меня возникают трудности с решением этой задачи, поскольку способ, который я использовал выше, отнимает атрибут "раса" у foreign_first_random.
Любая помощь будет оценена по достоинству. Извините, если это трудно понять/прочитать. Это мой первый пост. Спасибо!
Вы можете сделать случайный выбор в Race, оттуда вы можете выбрать случайные VillagerFirstNames
и VillagerLastNames
. Например:
race = Race.objects.all().order_by('?').first()
race_firstname = race.villagerfirstname_set.all().order_by('?').first()
race_lastname = race.villagerlastname_set.all().order_by('?').first()
Здесь order_by('?')
делает набор запросов случайным.
Update
Чтобы передать значения в шаблон, вы можете попробовать следующим образом:
context["foreign_first"] = race.villagerfirstname_set.order_by('?')[:5]
context["foreign_last"] = race.villagerlastname_set.order_by('?')[:5]