Результат подзапроса в Django не повторяется из выпадающего списка - PullRequest
0 голосов
/ 09 февраля 2020

Это ошибка, которую я получаю:

QuerySet.annotate () получил невыражение (я): 17

Мне нужен подзапрос, который будет сделать что-то похожее на

select * from inecdb.announced_pu_results 
where polling_unit_uniqueid in
(
select uniqueid from polling_unit 
where lga_id = (select uniqueid from lga where uniqueid= 17) 
);

Подзапрос

obj3 = Pu_results.objects.filter(polling_unit_uniqueid__in=Subquery(Unit.objects.filter(lga_id=obj1)))

не отображает никакого результата, пожалуйста, может любая помощь

Это мой взгляд

if request.method == 'POST':
    selected_item = request.POST.get('item_id') #This is from html select box 

    obj = Lga.objects.get(lga_id=selected_item)
    obj1 = obj.lga_id
    obj3 = Pu_results.objects.filter(polling_unit_uniqueid__in=Subquery(Unit.objects.filter(lga_id=obj1)))
    for obt in obj3:
        print(obt.party_score) #I want looping results here

Это моя модель

from django.db import models
from django.urls import reverse
#from django.urls import reverse

class Unit(models.Model):
    uniqueid   = models.IntegerField(primary_key=True)
    polling_unit_id = models.IntegerField(blank=False)
    ward_id  = models.IntegerField(default=False)
    lga_id = models.IntegerField(default=False)
    uniquewardid = models.IntegerField(default=True)
    polling_unit_number = models.CharField(max_length=50, unique=True)
    polling_unit_name = models.CharField(max_length=51)
    #pulling_unit_number = models.CharField(max_length=50)
    polling_unit_description = models.CharField(max_length=300)
    lat = models.CharField(max_length=255)
    long = models.CharField(max_length=255)
    entered_by_user = models.CharField(max_length=50)
    date_entered = models.DateTimeField(blank=False)
    user_ip_address = models.CharField(max_length=50)


    def get_absolute_url(self):
        #return f"/products/{self.id}/"
        return reverse("polling:inec-pull-result", kwargs={"uniqueid": self.uniqueid})


class Lga(models.Model):
    uniqueid = models.AutoField(primary_key=True)
    lga_id = models.IntegerField()
    lga_name = models.CharField(max_length=50)
    state_id = models.IntegerField()
    lga_description = models.TextField(blank=True, null=True)
    entered_by_user = models.CharField(max_length=50)
    date_entered = models.DateTimeField()
    user_ip_address = models.CharField(max_length=50)

    class Meta:
        db_table = 'lga'

class Article(models.Model):
    title   = models.CharField(max_length=120)
    content = models.TextField()
    active  = models.BooleanField(default=True)

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Это также работает:

obj3 = Pu_results.objects.filter(
         polling_unit_uniqueid__in = Subquery(
           Unit.objects.values('uniqueid').filter(lga_id=obj1)
         )
       )
0 голосов
/ 10 февраля 2020

Необходимо убедиться, что набор запросов, который вы используете для подзапроса, возвращает только один столбец, для этого используйте values(). Обратите внимание, что Subquery не требуется:

units = Unit.objects.filter(lga_id=obj1).values('uniqueid')

obj3 = Pu_results.objects.filter(polling_unit_uniqueid__in=units)

Прочитайте документацию для in lookup для более подробного объяснения передачи QuerySet в in.

...