Django在具有多个值的多个字段中搜索

时间:2017-06-05 09:08:23

标签: django model django-queryset

我有一个模型,用于存储用户的登录注销时间和日期

import sys
import random
import pygame as pg


class Asteroid:

    def __init__(self):
        self.image = pg.Surface((50, 50))
        self.image.fill((150, 60, 10))
        self.pos = pg.math.Vector2(random.randrange(1230),
                                   random.randrange(750))
        self.vel = pg.math.Vector2(random.uniform(-5, 5),
                                   random.uniform(-5, 5))

    def update(self):
        self.pos += self.vel


class Game:

    def __init__(self):
        pg.init()
        self.screen = pg.display.set_mode((1280, 800))
        self.clock = pg.time.Clock()
        self.bg_color = pg.Color(20, 20, 20)
        self.asteroids = [Asteroid() for _ in range(10)]
        self.done = False

    def run(self):
        while not self.done:
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    self.done = True

            for asteroid in self.asteroids:
                asteroid.update()

            self.screen.fill(self.bg_color)
            for asteroid in self.asteroids:
                self.screen.blit(asteroid.image, asteroid.pos)

            pg.display.flip()
            self.clock.tick(30)


Game().run()
pg.quit()
sys.exit()

现在我需要在日期用户名字段中搜索此模型。我有一个表单,其中包含 date_from date_to 用户名作为输入。任何字段都可以为空。如果用户名 空白,则会返回所有结果。现在,实现所需查询集的查询集是什么。

4 个答案:

答案 0 :(得分:1)

这应该做的工作:

if not username:
    return LoginLogout.objects.all()
else:
    return LoginLogout.objects.filter(date__gte=date_from,
                                      date__lte=date_to,
                                      username=username)

答案 1 :(得分:1)

  

我需要通过字段日期和用户名搜索此模型。我有一个表单,它将date_from,date_to和username作为输入。

您想了解Django's query expressions

events = LoginLogout.objects.filter(
        username=username,
        date__ge=date_from,
        date__le=date_to,
)
  

任何字段都可以为空。如果用户名为空,则将返回所有结果。

这些都是特殊情况,应该在代码中表示。

filter_args = {}
if username:
    filter_args['username'] = username
    if date_from:
        filter_args['date__ge'] = date_from
    if date_to:
        filter_args['date__le'] = date_to
events = LoginLogout.objects.filter(**filter_args)

答案 2 :(得分:0)

你必须使用很多,否则......

我只是给你查询

# Case 1: All res:
res = LoginLogout.objects.all()
# Case 2: date_to is blank:
res = LoginLogout.objects.filter(login_time__gt = date_from)
# Case 3: date_from is blank
res = LoginLogout.Objects.filter(logout_time__lt = date_to)
# Case 4: all value
res = LoginLogout.Objects.filter( Q(username= username) & Q(login_...) & Q(logout_...)
# Or:
res = LoginLogout.Objects.filter(username= username, login_time__gt = ...)

答案 3 :(得分:0)

试试这个:

from django.db.models import Q

if username or date_from or date_to:
    LoginLogout.objects.filter(
                               Q(username=username),
                               Q(date__gt='date_from'),
                               Q(date__lt='date_to')
                              )
else:
    LoginLogout.objects.all()