2016-07-11 27 views
0

Brauchen Sie Hilfe mit eins zu eins Reverse Lookup. Meine Modelle:Django eins zu eins Reverse Lookup Override

class User(MarkedAsDeletedMixin): 
    fields here 

class UserProfile(MarkedAsDeletedMixin): 
    user = models.OneToOneField(User) 

class MarkedAsDeletedMixin(models.Model): 
    marked_as_deleted = models.BooleanField(default=False) 

    class Meta: 
     abstract = True 

    def delete(self, *args, **kwargs): 
     self.marked_as_deleted = True 
     self.save() 

Sie können sehen, ich bin das Überschreiben der delete Methode so, wenn ich someuser.userprofile.delete() Ich markiere nur die Userprofile Objekt als gelöscht.

Das Problem kommt, wenn ich someuser.userprofile nachher mache. Ich bekomme userprofile, da ich das userprofile nicht gelöscht habe, habe ich es einfach als gelöscht markiert.

Um nur Benutzerprofilobjekte zu erhalten, die nicht als gelöscht markiert sind, muss ich die 1: 1-Rückwärtssuche von User überschreiben oder etwas mit dem Manager von UserProfile machen. Irgendwelche Ideen?

Antwort

0

Technisch gesehen existiert der Datensatz so, user.profile zu überschreiben es wäre sinnlos. Das würde den Code schwerer verständlich machen.

Sie könnten eine Methode hinzufügen:

class User(MarkedAsDeletedMixin): 
    def get_profile(): 
     return self.profile if self.profile and not self.profile.marked_as_deleted else None 

class UserProfile(MarkedAsDeletedMixin): 
    user = models.OneToOneField(User, related_name="profile") 

Diese Eins-zu-Eins-Beziehung ist und die Haupteinheit ist der Benutzer beispielsweise nicht die Userprofile Instanz. Mit anderen Worten, die user ist, was in den meisten Code verwendet wurde. In einer Ansicht verwenden Sie beispielsweise request.user.

Ich bin mir nicht sicher, was ein weich gelöschtes Profil in Ihrer Anwendung bedeutet, aber stellen wir uns vor es bedeutet, es ist nicht öffentlich. In diesem Fall würde ich dies in den User sparen:

class User(MarkedAsDeletedMixin): 
    is_profile_public = models.BooleanField(default=True) 
0

Ja, Sie einen Manager nutzen könnten, dann würden Sie nur get_queryset ändern müssen. Es ist wahrscheinlich am besten, dies auf einen Manager für die MarkedAsDeletedMixin - die von jeder Unterklasse geerbt werden sollte. Etwas wie dieses:

from django.db import models 

class MarkedAsDeletedManager(models.Manager): 

    use_for_related_fields = True 

    def get_queryset(self): 
     return self.filter(marked_as_deleted=False) 

class MarkedAsDeletedMixin(models.Model): 
    marked_as_deleted = models.BooleanField(default=False) 
    objects = MarkedAsDeletedManager() 

    class Meta: 
     abstract = True 

    def delete(self, *args, **kwargs): 
     self.marked_as_deleted = True 
     self.save()