Saya memiliki yang berikut ini:
answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()])
lalu nanti:
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)
Saya mendapatkan kesalahan:
'QuerySet' object has no attribute 'remove'
Saya sudah mencoba segala cara untuk mengubah QuerySet menjadi set standar atau daftar. Tidak ada yang berhasil.
Bagaimana cara saya menghapus item dari QuerySet sehingga tidak menghapusnya dari database, dan tidak mengembalikan QuerySet baru (karena itu dalam loop yang tidak berfungsi)?
Mengapa tidak hanya panggilan
list()
padaQueryset
?Ini juga akan mengevaluasi
QuerySet
/ menjalankan kueri. Anda kemudian dapat menghapus / menambahkan dari daftar itu.sumber
set
dan kemudian kembali kelist
untuk mendapatkan yang unik.Agak sulit untuk mengikuti apa yang sebenarnya Anda coba lakukan. Pernyataan pertama Anda sepertinya Anda mengambil objek QuerySet of Answer yang persis sama dua kali. Pertama melalui
answer_set.answers.all()
dan kemudian melalui.filter(id__in=...)
. Periksa kembali di shell dan lihat apakah ini akan memberi Anda daftar jawaban yang Anda cari:Setelah Anda membersihkannya sehingga sedikit lebih mudah bagi Anda (dan orang lain yang mengerjakan kode) untuk membaca, Anda mungkin ingin melihat .exclude () dan pencarian bidang __in .
Pencarian di atas mungkin tidak sinkron dengan definisi model Anda, tetapi mungkin akan membuat Anda cukup dekat untuk menyelesaikan pekerjaan sendiri.
Jika Anda masih perlu mendapatkan daftar nilai id maka Anda ingin bermain dengan .values_list () . Dalam kasus Anda, Anda mungkin ingin menambahkan flat opsional = True.
sumber
new_answers = answers.exclude(question_answer__in=existing_question_answers.values_list('id', flat=True))
@istrubleflat=True
Terima kasih !!!!!!!Dengan menggunakan operator slice dengan parameter step yang akan menyebabkan evaluasi queryset dan membuat daftar.
atau awalnya Anda bisa melakukan:
sumber
Anda dapat langsung mengonversi menggunakan
list
kata kunci. Sebagai contoh:Berikut
list
adalah kata kunci danobj
hasil dari set kueri danlist1
variabel dalam variabel itu kita menyimpan hasil konversi yang masuklist
.sumber
list1 = list(emp.objects.all())
yang tampaknya kontra-intuitif.Mengapa tidak menelepon saja
.values('reqColumn1','reqColumn2')
atau.values_list('reqColumn1','reqColumn2')
di queryset?answers_list = models.objects.values('reqColumn1','reqColumn2')
result = [{'reqColumn1':value1,'reqColumn2':value2}]
ATAU
answers_list = models.objects.values_list('reqColumn1','reqColumn2')
result = [(value1,value2)]
Anda bisa melakukan semua operasi pada QuerySet ini, yang Anda lakukan untuk daftar.
sumber
kode ini mengubah django queryset ke daftar python
sumber
Coba ini
values_list('column_name', flat=True)
.Ini akan mengembalikan Anda daftar dengan nilai kolom tertentu
sumber
alih-alih
remove()
Anda dapat menggunakanexclude()
fungsi untuk menghapus objek dari queryset. sintaksnya mirip denganfilter()
mis . : -
dalam kode di atas itu menghapus semua objek dari qs dengan id '1'
info tambahan : -
filter()
digunakan untuk memilih objek tertentu tetapiexclude()
digunakan untuk menghapussumber