Содержащийся в с идентификатором по умолчанию в качестве параметра не работает

#python #django

#python #django

Вопрос:

Я хочу проверить, находится ли идентификатор страницы упражнений внутри массива для решаемых упражнений. Я думал, что это может быть легко сделать с contained_by , но это не работает.

Я пробовал эту строку (но я также хочу рандомизировать вопросы)

 randomQuestions = Exercises.objects.filter(id__contained_by=(req.user.profile.exercitiiProvocari).order_by("?")
  

но это не работает.
Я получаю эту ошибку:

 Unsupported lookup 'contained_by' for AutoField or join on the field not permitted, perhaps you meant contains or icontains?
  

Я полагаю, что эта ошибка связана с тем фактом, что ID является автоматически сгенерированным полем django, но я понятия не имею, как это исправить.

views.py

 from django.shortcuts import render
from exercitii.models import Exercises 

# Create your views here.
def index(req):
    return render(req, "../templates/pagini/provocari.html")

def provocari(req):
    randomQuestions = Exercises.objects.filter(id__contained_by=(req.user.profile.exercitiiProvocari).order_by("?")
    print(randomQuestions)
    return render(req, "../templates/pagini/provocare.html")
  

Модель Exercitii

 from django.db import models
from django.contrib.postgres.fields import ArrayField
from lectii.models import Lectie

# Create your models here.
class Exercises(models.Model):
    idLectie = models.ForeignKey(Lectie, on_delete=models.DO_NOTHING, blank=True, null=True)
    intrebare = models.CharField(max_length = 300)
    variante = ArrayField(models.CharField(max_length=300), null=True)
    variantaCorecta = models.CharField(max_length = 1)
    def __str__(self):
        return self.intrebare
  

Итак, что я на самом деле делаю, так это пытаюсь сопоставить массив всех упражнений с массивом с идентификаторами уже решенных упражнений и рандомизацией результата.

Но когда я пытаюсь изменить ситуацию, я получаю эту ошибку.

Комментарии:

1. Похоже, что паретезис в запросе не уравновешен; кажется, есть еще один открывающий паретезис, чем закрывающий паретезис. Не могли бы вы перепроверить это?

Ответ №1:

Разве простого in поиска не было бы достаточно для этого случая?

Предполагая req.user.profile.exercitiiProvocari , что это какой-то массив / список / контейнер, вы могли бы попробовать что-то вроде этого:

 randomQuestions = Exercises.objects.filter(id__in=req.user.profile.exercitiiProvocari)
    .order_by("?")
  

Чтобы исключить кажущиеся вопросы, вы можете попробовать использовать exclude() . Это вернет все вопросы, которых НЕТ, req.user.profile.exercitiiProvocari и они должны быть в случайном порядке:

 randomQuestions = Exercises.objects.exclude(id__in=req.user.profile.exercitiiProvocari)
    .order_by("?")
  

Комментарии:

1. Проблема в том, что я не хочу, чтобы идентификатор был. Я пытался заставить его работать как этот atm, но после этого я хотел бы попробовать оператор отрицания. Я думаю, что «in» не может работать.

2. @OctavianNiculescu вы пробовали exclude() вместо filter() ?

3. Я даже не знал, что он существует tbh. Я искал в документах только оператор отрицания для использования в filter. Можете ли вы показать мне, как это будет?

4. @OctavianNiculescu просто замените filter() на exclude() ; см. Мой отредактированный ответ.

5. Идеальный ответ. Большое спасибо 🙂