2016-07-11 70 views
0

需要一對一反向查找幫助。我的模型:django一對一反向查找覆蓋

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() 

你可以看到我重寫delete方法,所以當我做someuser.userprofile.delete()我只是標記USERPROFILE對象刪除。

問題出在我做someuser.userprofile之後。我得到了userprofile,因爲我沒有刪除userprofile,我只是將其標記爲已刪除。

爲了僅獲取未標記爲已刪除的用戶配置文件對象,我需要覆蓋User的一對一反向查找或對UserProfile的管理器執行某些操作。有任何想法嗎?

回答

0

從技術上講,記錄存在這麼覆蓋user.profile隱藏它是沒有意義的。這會讓代碼更難理解。

你可以添加一個方法來代替:

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") 

這是一對一的關係,主要實體是用戶實例,而不是在用戶配置實例。換句話說,user就是大多數代碼所使用的。例如,在視圖中,您使用request.user

我不確定一個軟刪除的配置文件在你的應用程序中意味着什麼,但讓我們想象它意味着它不公開。在這種情況下,我想將它保存在User

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

是的,你可以使用一個管理者,你只需要修改get_queryset。最好把它放在MarkedAsDeletedMixin的管理器上 - 它應該被任何子類繼承。類似這樣的:

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()