#python #django #orm
#python #django #orm
Вопрос:
Я хочу получить результат двух данных запроса с использованием ORM в django, но отображаются только одни данные. Как я могу это решить?
Мои коды:
views.py
def home(request):
codes, descrp = Major.objects.raw('SELECT p.major_cd, m.description FROM percentages p, major m WHERE p.major_cd = m.major_cd;')
context = {
"codes": codes,
"descrp": descrp
}
return render(request, "website/index.html" , context )
index.html
<select class="form-control select2">
<option>Select Major Head</option>
{% for cd, ds in codes, descrp %}
<option> {{ cd, ds }} </option>
{% endfor %}
</select>
Модели
class Major(models.Model):
major_cd = models.IntegerField(primary_key=True)
description = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = False
db_table = 'major'
class Percentages(models.Model):
major_cd = models.IntegerField(primary_key=True)
percentage = models.CharField(max_length=5, blank=True, null=True)
class Meta:
managed = False
db_table = 'percentages'
Я хочу отфильтровать ‘major_cd’ в основной таблице на основе ‘major_cd’ в таблице процентов.
Ожидаемые результаты: данные со столбцом = major_cd, описание из основной таблицы
Комментарии:
1. Вы уверены, что запрос работает нормально? Я бы подумал, что
codes
это вернет первую запись иdescrp
является второй записью. Можете ли вы поделиться своими моделями и образцами данных вместе с ожидаемым результатом?2. @WillemVanOnsem Я отредактировал свой вопрос и добавил свои модели
Ответ №1:
Мне кажется, что было бы лучше переписать модель в a ForeignKey
, это делает запросы в Django более удобными:
class Major(models.Model):
major_cd = models.IntegerField(primary_key=True)
description = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = False
db_table = 'major'
class Percentages(models.Model):
major_cd = models.OneToOneField(
Major,
on_delete=models.CASCADE,
primary_key=True,
db_column='major_cd'
)
percentage = models.CharField(max_length=5, blank=True, null=True)
class Meta:
managed = False
db_table = 'percentages'
Как только это будет сделано, мы можем запросить с:
def home(request):
majors = Major.objects.filter(percentage__isnull=False)
context = {
'majors': majors
}
return render(request, 'website/index.html', context)
Затем в шаблоне мы можем отобразить это с помощью:
<select class="form-control select2">
<option>Select Major Head</option>
{% for major in majors %}
<option>{{ major.pk }}: {{ major.description }}</option>
{% endfor %}
</select>
Комментарии:
1. БОЛЬШОЕ ВАМ СПАСИБО. НАКОНЕЦ-ТО ЭТО СРАБОТАЛО !! : D
Ответ №2:
вы можете использовать Q из django.db.models import Q.
например, вы можете сделать это так .. descrp = Major.objects.filter(Q(major_cd=.major_cd) amp; Q(m_description=m.description))