Я хочу получить результат двух данных запроса с использованием ORM в django

#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))