Mam:
answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()])
potem później:
for i in range(len(answers)):
# iterate through all existing QuestionAnswer objects
for existing_question_answer in existing_question_answers:
# if an answer is already associated, remove it from the
# list of answers to save
if answers[i].id == existing_question_answer.answer.id:
answers.remove(answers[i]) # doesn't work
existing_question_answers.remove(existing_question_answer)
Pojawia się błąd:
'QuerySet' object has no attribute 'remove'
Próbowałem przerobić QuerySet na standardowy zestaw lub listę. Nic nie działa.
Jak mogę usunąć element z QuerySet, aby nie usuwał go z bazy danych i nie zwracał nowego zestawu QuerySet (ponieważ jest w pętli, która nie działa)?
Dlaczego nie po prostu zadzwoń
list()
poQueryset
?Spowoduje to również ocenę
QuerySet
/ uruchom zapytanie. Następnie możesz usunąć / dodać z tej listy.źródło
set
a potem z powrotem,list
aby uzyskać unikalne.Trochę trudno jest śledzić to, co naprawdę próbujesz zrobić. Twoje pierwsze stwierdzenie wygląda na to, że możesz dwukrotnie pobrać dokładnie te same obiekty QuerySet of Answer. Najpierw przez,
answer_set.answers.all()
a potem ponownie przez.filter(id__in=...)
. Dokładnie sprawdź w powłoce i zobacz, czy da ci to listę odpowiedzi, których szukasz:Po wyczyszczeniu tego, aby czytanie było trochę łatwiejsze dla Ciebie (i innych osób pracujących nad kodem), możesz zajrzeć do .exclude () i wyszukiwania pól __in .
Powyższe wyszukiwanie może nie zsynchronizować się z definicjami modelu, ale prawdopodobnie zbliży Cię na tyle, aby samemu zakończyć pracę.
Jeśli nadal potrzebujesz listy wartości identyfikatorów, powinieneś pobawić się z .values_list () . W twoim przypadku prawdopodobnie będziesz chciał dodać opcjonalny flat = True.
źródło
new_answers = answers.exclude(question_answer__in=existing_question_answers.values_list('id', flat=True))
@istrubleflat=True
dzięki !!!!!!!Poprzez użycie operatora wycinka z parametrem step, który spowodowałby ocenę zestawu zapytań i utworzenie listy.
lub początkowo mogłeś zrobić:
źródło
Możesz bezpośrednio konwertować za pomocą
list
słowa kluczowego. Na przykład:Oto
list
słowo kluczowe iobj
jest wynikiem zestawu zapytań ilist1
jest zmienną w tej zmiennej, w której przechowujemy przekonwertowany wynik, w którymlist
.źródło
list1 = list(emp.objects.all())
co wydaje się sprzeczne z intuicją.Dlaczego po prostu nie zadzwonić
.values('reqColumn1','reqColumn2')
lub nie.values_list('reqColumn1','reqColumn2')
włączyć zestawu zapytań?answers_list = models.objects.values('reqColumn1','reqColumn2')
result = [{'reqColumn1':value1,'reqColumn2':value2}]
LUB
answers_list = models.objects.values_list('reqColumn1','reqColumn2')
result = [(value1,value2)]
Możesz wykonać wszystkie operacje na tym QuerySet, które wykonujesz dla list.
źródło
ten kod konwertuje zestaw zapytań django na listę Pythona
źródło
Spróbuj tego
values_list('column_name', flat=True)
.Zwróci listę z określonymi wartościami kolumn
źródło
zamiast
remove()
ciebie możesz użyćexclude()
funkcji do usunięcia obiektu z zestawu zapytań. jego składnia jest podobna dofilter()
np . : -
w powyższym kodzie usuwa wszystkie obiekty z qs o id '1'
dodatkowe informacje : -
filter()
służy do wybierania określonych obiektów, aleexclude()
służy do usuwaniaźródło