我想过滤实现这个“伪代码”:
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管理命令中。
任何帮助都会很棒!
答案 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/