django一对一反向查找覆盖

时间:2016-07-11 00:53:31

标签: django django-models one-to-one django-managers

需要一对一反向查找的帮助。我的模特:

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的管理器执行某些操作。有什么想法吗?

2 个答案:

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