Django custom managers - how do I return only objects created by the logged-in user?

前端 未结 3 1388
粉色の甜心
粉色の甜心 2020-11-28 22:19

I want to overwrite the custom objects model manager to only return objects a specific user created. Admin users should still return all objects using the objects model mana

相关标签:
3条回答
  • 2020-11-28 23:16

    It seems necessary to use the middleware to store the user information.

    However, I'd rather not modify the default ModelManager objects, but hook it upto a different manager, that I will use in the code, say in your case user_objects instead of objects.

    Since you will use this only within views that are @login_required you dont need all the complex error handling in the Middleware.

    Just my 2¢.

    0 讨论(0)
  • 2020-11-28 23:18

    Or even simpler and use foreign key to retrieve queryset.

    If you have model like that

    class HourRecord(models.Model):
        created_by = ForeignKey(get_user_model(), related_name='hour_records')
    

    You can query HourRecords in a view by user with simply:

    request.user.hour_records.all()
    
    0 讨论(0)
  • 2020-11-28 23:25

    One way to handle this would be to create a new method instead of redefining get_query_set. Something along the lines of:

    class UserContactManager(models.Manager):
        def for_user(self, user):
            return super(UserContactManager, self).get_query_set().filter(creator=user)
    
    class UserContact(models.Model):
        [...]
        objects = UserContactManager()
    

    This allows your view to look like this:

    contacts = Contact.objects.for_user(request.user)
    

    This should help keep your view simple, and because you would be using Django's built in features, it isn't likely to break in the future.

    0 讨论(0)
提交回复
热议问题