如何使用Django中的表达式进行过滤

时间:2016-02-26 17:58:30

标签: python django django-commands

我想过滤实现这个“伪代码”:

Cisco2960 7430 A01 J01 --> Server1 7430 A02 J08 "RJ-45" 
Cisco2960 7430 A01 J03 --> Server2 7431 A09 J08 "RJ-45"
Cisco2960 7430 A01 J02 --> Server3 7432 A27 J09 "SFP+"

我也想将它包装在Django管理命令中。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:5)

过滤

不确定您的字段的外观,但这里有一个提示:

让我们像这个F('timestamp') - F('duration')一样撰写一个 F表达式,并用它来注释我们的查询:

from django.db.models import DateTimeField, ExpressionWrapper, F

Post.objects.annotate(
        timestamp_minus_duration=ExpressionWrapper(
            F('timestamp') + F('duration'),
            output_field=DateTimeField()
        )
    )

现在您可以使用带注释的字段进行过滤

   Post.objects.annotate(
        timestamp_minus_duration=ExpressionWrapper(
            F('timestamp') + F('duration'),
            output_field=DateTimeField()
        )
    ).filter(
        timestamp_minus_duration__gt=datetime.datetime.now()
    )

参考:https://docs.djangoproject.com/en/1.9/topics/db/queries/#using-f-expressions-in-filters

参考:https://docs.djangoproject.com/es/1.9/ref/models/expressions/#using-f-with-annotations

参考:https://docs.djangoproject.com/es/1.9/topics/db/aggregation/#filtering-on-annotations

管理命令

只需将代码放入命令的handle()方法

即可
# yourapp/management/commands/deletepost.py

from django.core.management.base import BaseCommand, CommandError
from yourapp.models import Post

class Command(BaseCommand):
    help = 'Describe your cmd here'

    def handle(self, *args, **options):
           Post.objects.annotate(...).filter(...).delete()

更多详情:https://docs.djangoproject.com/en/1.9/howto/custom-management-commands/