簡體   English   中英

Django:get_queryset(self)中的條件表達式

[英]Django : Conditional expressions in get_queryset(self)

我在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)中過濾器內部移動此條件檢查的內容這樣,我就可以使用過濾后的QuerySet直接進行其他簡單的訂單/過濾器操作。 用過濾后的變量列表id重新創建QuerySet看起來太沉重了(像這樣: Django從id數組中以特定順序獲取QuerySet )。

有任何想法嗎 ?

謝謝。

不太確定我對您的理解很好。 無論如何,如何為模型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
        ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM