Django Tastypie Advanced Filtering: How to do complex lookups with Q objects

后端 未结 3 1838
遥遥无期
遥遥无期 2020-12-02 20:51

I have a basic Django model like:

class Business(models.Model):
    name = models.CharField(max_length=200, unique=True)
    email = models.EmailField()
             


        
3条回答
  •  不知归路
    2020-12-02 21:06

    I solved this problem like so:

    Class MyResource(ModelResource):
    
      def __init__(self, *args, **kwargs):
        super(MyResource, self).__init__(*args, **kwargs)
        self.q_filters = []
    
      def build_filters(self, filters=None):
        orm_filters = super(MyResource, self).build_filters(filters)
    
        q_filter_needed_1 = []
        if "what_im_sending_from_client" in filters:
          if filters["what_im_sending_from_client"] == "my-constraint":
            q_filter_needed_1.append("something to filter")
    
        if q_filter_needed_1:
          a_new_q_object = Q()
          for item in q_filter_needed:
            a_new_q_object = a_new_q_object & Q(filtering_DB_field__icontains=item)
          self.q_filters.append(a_new_q_object)
    
      def apply_filters(self, request, applicable_filters):
        filtered = super(MyResource, self).apply_filters(request, applicable_filters)
    
        if self.q_filters:
          for qf in self.q_filters:
            filtered = filtered.filter(qf)
          self.q_filters = []
    
        return filtered
    

    This method feels like a cleaner separation of concerns than the others that I've seen.

提交回复
热议问题