首页 文章

Django:get_queryset中的条件表达式(self)

提问于
浏览
0

我在Django 1.11,我想结合我读到的内容:

例如,假设我有这样的东西,将检查对象是否在用户区域,ListView使用它 .

open_help_requests = HelpRequest.objects.filter(state=HelpRequest.OPEN)
    filtered_help_requests = []
    for help_request in open_help_requests:
        """ Formule de Haversine pour connaitre la distance entre deux points géographiques """
        earth_radius = 6373.0

        lat1 = radians(help_request.student.studentcollaborator.postal_code.latitude)
        lon1 = radians(help_request.student.studentcollaborator.postal_code.longitude)
        lat2 = radians(request.user.student.studentcollaborator.postal_code.latitude)
        lon2 = radians(request.user.student.studentcollaborator.postal_code.longitude)

        dlon = lon2 - lon1
        dlat = lat2 - lat1

        a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
        c = 2 * atan2(sqrt(a), sqrt(1 - a))

        distance = earth_radius * c
        if distance <= help_request.settings.distance:
            filtered_help_requests.append(help_request)

我想在 def get_queryset(self): 中的 filter 内移动此条件检查,以便我可以使用过滤的QuerySet直接进行其他简单的顺序/过滤操作 . 使用已过滤的变量列表ID重新创建QuerySet看起来太重(例如:Django get a QuerySet from array of id's in specific order) .

有任何想法吗 ?

谢谢 .

1 回答

  • 0

    我不太清楚我很了解你 . 无论如何,为您的模型 models.Manager 创建自定义 models.QuerySet 怎么样?

    在您的自定义 models.QuerySet 中,您可以为订购/过滤目标创建自己的功能 .

    在您的视图中,您可以直接获取对象的过滤/有序列表 .

    class Foo(models.Model):
        ....
        objects = FooManager()
        ....
    
    class FooManager(models.Manager):
        ....
        def get_queryset(self):
            return FooQuerySet(self.model, using=self._db)
        ....
    
    class FooQuerySet(models.QuerySet):
        ....
        # define your functions here
        # just a simple example
        def order(self, *args, **kwargs):
            return self.filter(
                # you may use Q objects here or whatever 
                ).distinct()
            else:
               return self
        ....
    

    在你看来:

    class BarView(ListView):
        ....
        def get_queryset(self):
            ....
            return Foo.objects.all().order(params) # your custom function
            ....
    

相关问题