Django'da birden çok nesneyi sil


108

Bir web sayfası kullanarak django'daki veritabanımdan silinecek birkaç nesne seçmem gerekiyor. Aralarından seçim yapabileceğim bir kategori yok, bu yüzden hepsinden bu şekilde silemiyorum. Kendi silme formumu uygulayıp django'da işlemem gerekiyor mu yoksa django'nun bunu zaten yapmanın bir yolu var mı? Yönetici arayüzünde uygulandığı gibi.

Yanıtlar:


203

İstediğiniz herhangi bir QuerySet'i silebilirsiniz. Örneğin, bazı Yazı modelleriyle tüm blog gönderilerini silmek için

Post.objects.all().delete()

ve yayın tarihi ileride olan herhangi bir Yayını silmek için

Post.objects.filter(pub_date__gt=datetime.now()).delete()

Ancak, Sorgu Kümenizi daraltmanın bir yolunu bulmanız gerekir. Bir görünümün yalnızca belirli bir nesneyi silmesini istiyorsanız, genel silme görünümüne bakın .

DÜZENLE:

Yanlış anlaşılma için üzgünüm. Sanırım cevap arasında bir yerde. Kendinizinkini uygulamak için, ' ModelFormler ile genel görünümleri birleştirin . Aksi takdirde, benzer işlevsellik sağlayan 3. taraf uygulamalarına bakın. Bir de ilgili soruya , öneri oldu django-filtre .


1
Hayır soruyu yanlış anladın. Her şeyi silebileceğimi anlıyorum. Ancak, web sayfasındaki bir formla silinecek nesneleri seçmem gerekiyor. Ve sonra formdan döndürülen verileri views.py dosyasında işleyin. Ardından, veriler arasında döngü oluştururken, formda silerek döndürülenlerin üzerinden geçin. Ama bunu django'da uygulamak için en iyi uygulamanın ne olduğunu bilmek istedim.
Dean

Ah, benim hatam! Ya üçüncü taraf bir uygulama ya da e-postalı genel görünümler kullanırdım ModelForm.
Matt Luongo

7
@Dean, şu silme görünümüne bir göz atın. Ya da sadece kendi görüşünüzü yazabilirsiniz ... Yani sonuçta muhtemelen bir PK listesi alıyorsunuz ve modelinizde silme çağrısı MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()yapıyorsunuz ... ve eminim rastgele bir kişinin hepsini silemeyeceğinden emin olmak için bir şeyler istiyorsunuz DB'nizdeki nesneleri PK'leri tahmin ederek.
Yuji 'Tomita' Tomita

1
@Dean, daha fazlasını anlamadan soruna cevap vermek zor. Sadece bir kullanıcının doğru silme kriterini seçmesine izin veren bir form oluşturmanız gerekir (bu ne olursa olsun - belki de birinin bir kimlik numarasını yazdığı bir giriş kutusu ... ama muhtemelen daha karmaşık), buna yanıt veren bir görünüm oluşturun form, belki de doğrulama (izinler) gerçekleştirir ve sonunda bu filter(foo).delete()yöntemi çalıştırır .
Yuji 'Tomita' Tomita

1
Bunun çerçeveyle gelmemesinin nedenlerinden biri, @ YujiTomita tarafından bahsedilen düzenleme / silme ve diğer karmaşıklıklar için yetkilendirme sorunudur. Gerçekten karmaşık filtrelemeye ihtiyacınız varsa, django filtrelemeye göz atın ve kullanıcı yetkili ise QuerySet.delete () 'i çağıran bir silme düğmesi ekleyin.
Matt Luongo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.