需要一对一反向查找的帮助。我的模特:
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,我只是将其标记为已删除。
为了只获取未标记为已删除的userprofile对象,我需要覆盖User
的一对一反向查找或使用UserProfile的管理器执行某些操作。有什么想法吗?
答案 0 :(得分:0)
从技术上讲,记录存在,因此覆盖rake db:migrate:reset
以隐藏它是没有意义的。这将使代码更难理解。
您可以改为添加方法:
user.profile
这是一对一的关系,主要实体是User实例,而不是UserProfile实例。换句话说,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
答案 1 :(得分: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()