18

Tworzę niestandardowy system komentowania, który może załączać komentarze do dowolnego modelu przy użyciu typów zawartości GenericForeignKey.Dlaczego moja kaskada GenericForeignKey nie jest usuwana?

class Comment(models.Model): 
    body = models.TextField(verbose_name='Comment') 
    user = models.ForeignKey(User) 
    parent = models.ForeignKey('self', null=True, blank=True) 
    created = models.DateTimeField(auto_now_add=True) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

Rozumiem, że gdy model, do którego dołączony jest komentarz, zostanie usunięty, należy usunąć i skasować komentarz.

Niestety tak się nie dzieje i jestem zdumiony. Czy są jakieś typowe powody, dla których zmieniłoby się domyślne zachowanie usuwania?

Odpowiedz

24

Nie, dokumentacja tego nie mówi. Mówi się, że jeśli zdefiniujesz GenericRelation na modelu - tj. Na odwrotnej stronie GenericForeignKey - wtedy, gdy element z ogólnym FK zostanie usunięty, element z GenericRelation również zostanie usunięty.

W przeciwieństwie do ForeignKey, GenericForeignKey nie akceptuje argumentu on_delete w celu dostosowania tego zachowania; w razie potrzeby można uniknąć kasowania kaskadowego po prostu nie używając GenericRelation, a alternatywne zachowanie może być zapewnione przez sygnał pre_delete.

+0

Dzięki, źle odczytałem ten fragment dokumentacji i założyłem, że to domyślnie będzie kaskadowo. – Soviut

+0

Bardzo dziękuję, gdzie były moje oczy ... – valex

+0

Myślę, że dokumentacja Django powinna określać to na odwrót. "GenericForeignKey NIE kasuje usuwania, zamiast tego ustawia wartość na null, ale tylko kaskadowo, jeśli GenericRelation jest używane w pokrewnym modelu.". Jest to potrzebne, ponieważ domyślnie otrzymujemy kaskadowe usuwanie w normalnych kluczach obcych. –

Powiązane problemy