Filtering django in a field in an external key object

Given the following models from the django survey tutorial:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently'


class Choice(models.Model):
    question = models.ForeignKey(Question)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

I want to be able to exclude questions without choice and choice, as suggested in the textbook. I played with a filter, but I can’t understand, I tried:

def get_queryset(self):
    return Question.objects.filter(pub_date__lte=timezone.now(), choice__count__gt=0)

but i get

Relation fields do not support nested lookups

How can I filter questions that have no choice?

+4
source share
4 answers

You can also use as below

from django.db.models import Count

......

def get_queryset(self):
    return Question.objects.annotate(num_choice=Count('choice')).filter(pub_date__lte=timezone.now(), num_choice=0)
+8
source

Use choice__isnull = True, where selection is the associated_name.

def get_queryset(self):
    return Question.objects.filter(pub_date__lte=timezone.now(), choice__isnull=False)
+2
source

choice__isnull=False count,

return Question.objects.filter(pub_date__lte=timezone.now(), 
                               choice__isnull=False)

, , , .distinct().

+1

- :

class Question(models.Model):
    choices = models.ManyToManyField('Choice')
    ...

class Choice(models.Model):
    question = models.ForeignKey(Question)
    ...

questions = Question.objects.annotate(num_of_choices=Count('choices')).filter(pub_date__lte=timezone.now(), num_of_choices=0)
0

All Articles