2016-04-14 22 views
0

Yönetici arayüzünde bir nesneyi silerken, ilgili nesnelerin kaldırılmasını önlemek istiyorum. RelatedObject yılında ForeignKey nullDjango: Yönetici göreli nesneleri silmeden nasıl yapılır?

class ObjectToDelete(models.Model): 
    timestamp = models.DateTimeField() 

class RelatedObject(models.Model): 
    otd = models.ForeignKey('app.ObjectToDelete', null=True, blank=True) 

beri, yerine bütün nesneyi silinmesinin None olarak ayarlayın gerekir. Ve bu tam olarak sahip olmak istediğim davranış.

Bu yönetici arabirimi için özel silme eylemleri oluşturabileceğimi biliyorum.

Ayrıca, RelatedObject'un kaldırılmasını da engelleyen ObjectToDelete numaralı telefondan ManyToManyField yapabildiğimin de farkındayım. Ama sonra istediğim bire çok ilişkisi olmazdı.

Bunu gerçekleştirmenin basit bir yolu var mı?

cevap

1

Yabancı anahtarınız için on_delete seçeneğini ayarlayın. Eğer ilgili nesne silinir None değeri ayarlamak istiyorsanız, SET_NULL kullanın: Bu kurallar geçerlidir

models.ForeignKey('app.ObjectToDelete', on_delete=models.SET_NULL) 

ancak yönetici panelinde bunu, ister bir nesne silebilir veya Modeli ile doğrudan çalışma örneği. (Ancak, SQL'de temel veritabanıyla doğrudan çalışırsanız etkili olmaz.)

+3

['SET_NULL'] kullanmak daha iyi olabilir (https://docs.djangoproject.com/en/1.9/ref OP, ilgili nesnenin silinmesini istemediğinden, örneğin 'CASCADE' yerine sizin örneğiniz için /models/fields/#django.db.models.SET_NULL). – Alasdair

+0

@Alasdair, evet haklısınız SET_NULL'u burada kullanabiliriz. Ancak performans açısından her ikisi de veritabanı seviyesinde, kimin daha hızlı olduğundan emin olamaz. –

+2

Hangisi daha hızlı değil. 'Models.CASCADE' kullanarak (Django 2.0'a kadarki varsayılan davranış) ilgili nesneleri siler. Tam olarak OP'nin kaçınmaya çalıştığı şey bu. – Alasdair