I have a privateboolean flag in my model and a user manager that overrides the get_query_set method, with a filter, removing private = True:
class myManager(models.Manager):
def get_query_set(self):
qs = super(myManager, self).get_query_set()
qs = qs.filter(private=False)
return qs
class myModel(models.Model):
private = models.BooleanField(default=False)
owner = models.ForeignKey('Profile', related_name="owned")
objects = myManager()
I want the default query to exclude default private models as a security measure to prevent accidental use of a model showing private models.
Sometimes, however, I want to show private models, so I have the following in the manager:
def for_user(self, user):
if user and not user.is_authenticated():
return self.get_query_set()
qs = super(myManager, self).get_query_set()
qs = qs.filter(Q(owner=user, private=True) | Q(private=False))
return qs
This works fine, with the restriction that I cannot bind a filter. This becomes a problem when I have fk indicating myModel and using otherModel.mymodel_set. otherModel.mymodel_set.for_user (user) does not work because mymodel_set returns a QuerySet object, not a manager.
, for_user() QuerySet, , ( , get_query_set) QuerySet , ( super(), .)
?
- , , djangoy/DRY, . , , .
manji , , , , . , , ?