How to use custom manager with related objects?

前端 未结 4 1614
无人共我
无人共我 2020-12-02 20:08

I have a custom manager. I want to use it for related objects. I found use_for_related_fields in docs. But it does not work the way I used it:

class Random         


        
4条回答
  •  伪装坚强ぢ
    2020-12-02 20:28

    Also, in the custom manager, make sure to access the queryset via the self.get_query_set() proxy method when implementing custom filters to be called from related manager:

    class EventManager(models.Manager):
    
        use_for_related_fields = True
    
        def visible_events(self):
            today = datetime.date.today()
            # don't do this !!! 
            # unsuitable for related managers as could retrieve extraneous objects
            # qs = super(EventManager, self).get_query_set()
            # Use queryset proxy method as follows, instead:
            qs = self.get_query_set()
            qs = qs.filter(visible_from__lte=today, visible_to__gte=today)
            return qs
    
    
    class Event(models.Model):
    
        visible_from = models.DateField(_(u'visible from'), null=False, blank=False)
        visible_to = models.DateField(_(u'visible to'), null=False, blank=False)
        concepts = models.ManyToManyField(Concept, through='ConceptEventRegistration')
    
        objects = EventManager()
    

    Sample usage:

    my_concept = Concept.objects.get(id=1)
    # retrieve all events related to the object
    my_concept.event_set.all()
    # retrieve all visible events related to the object
    my_concept.event_set.visible_events()
    

提交回复
热议问题