2017-02-22 2 views
1

Ich möchte einige Informationen über entfernte Benutzer (wie Benutzername) in Forum Posts zu zeigen. Wie kann ich das erreichen?Django erstellt einen "Sentinel" Benutzer auf löschen

Bisher habe ich dies:

class Post(models.Model): 
    (...) 
    creator = models.ForeignKey(User, blank=True, null=True,on_delete=models.SET(get_sentinel_user)) 

@receiver(pre_delete, sender=User, dispatch_uid='user_delete_signal') 
def create_sentinel_user(sender, instance, using, **kwargs): 
    SentinelUser.objects.get_or_create(\ 
    username=instance.username+" (left)")[0] 

def get_sentinel_user(): 
    return SentinelUser.objects.latest('id') 

aber wenn ich das verwenden in Admin, ist es nicht, weil aus irgendeinem Grund get_sentinel_user früher als pre_delete ausgeführt funktioniert und dafür die Sentinel-Benutzer noch nicht existiert, .

+0

Zum einen Du SentinelUsers im create_sentinel_user und SentinelUser im get tun. – Fred

+0

Ich bin mir dessen bewusst. Es ist so, weil ich kein Argument von den Modellen on_delete Funktionsaufruf übergeben kann, also muss ich sie trennen. – Stefan

+0

Ich sehe jetzt, das ist ein Tippfehler. Der Vorgang wird ausgeführt, es ist kein Fehler aufgetreten. Fest. – Stefan

Antwort

1

Wenn Ihr endgültiges Ziel darin besteht, Daten über den Benutzer zu speichern, schlägt die django user docs vor, das Flag is_active zu verwenden, anstatt Benutzer zu löschen. Auf diese Weise behalten Sie den Zugriff auf die Benutzerinformationen, müssen sich keine Sorgen über Ihre ForeignKey-Konsistenz machen und haben keinen zusätzlichen Aufwand, um einen Dummy-Benutzer für jeden Benutzer zu erstellen, den Sie löschen.

Sie könnten dies dann mit on_delete=models.PROTECT sichern, um sicherzustellen, dass Sie weiterhin die Konsistenz Ihrer Datenbank schützen.

Wenn aus irgendeinem Grund Sie Ihre Benutzer löschen haben , würde ich die delete() auf Post außer Kraft setzen, anstatt Signale zu verwenden versuchen.

So könnte eine Probelösung so etwas wie:

def delete(self): 
    self.created = SentinelUser.objects.get_or_create(username=self.created.username+" (left)")[0] 
    self.save() 
    return super(Post,self).delete(self) 
Verwandte Themen