我正在获取人员列表以及他们从同一项目中的 api 进行的测试。我希望用户可以选择查看在一个城市进行的测试数量,有三个选项 - 每天/每周/每月。models.py
class City(models.Model):
city_name=models.CharField(max_length=100,default='',blank=False)
class Person(models.Model):
title = models.CharField(max_length=3,default="mr",blank=False)
name = models.CharField(max_length=50,default='',blank=False)
address = models.CharField(max_length=200,default='',blank=False)
city = models.ForeignKey(City)
class Test(models.Model):
person = models.ForeignKey(Person)
date = models.DateTimeField(auto_now_add=True)
test_name = models.CharField(max_length=200,default='',blank=False)
subject = models.CharField(max_length=100,default='')
每个城市的人的json文件是这样生成的http://pastebin.com/pYLBjrjh
相关的
views.py
def personlist(request, id):
data = requests.get('http://127.0.0.1:8000/app/cities/' + id + '/persons/').json()
context = RequestContext(request, {
'persons': data['results'],'count': data['count'],
})
return render_to_response('template.html', context)
这将生成该城市中已参加测试的姓名列表。我想知道是否有办法让用户选择时间段。(每天/每周/每月)并且只查看在该时间段内参加测试的名称。
最佳答案
为了通过 Person Model 访问测试,您可以定义自己的 related_name 例如 tests
或仅使用 django test_set
提供的默认值:
class Test(models.Model):
person = models.ForeignKey(Person, related_name='tests')
date = models.DateTimeField(auto_now_add=True)
test_name = models.CharField(max_length=200,default='',blank=False)
subject = models.CharField(max_length=100,default='')
related_name 定义反向关系,以便您可以执行以下查询:
person_1.tests.all()
person_1.tests.filter(date=date)
person_1.tests.filter(date__day=day) # day is an integer
person_1.tests.filter(date__month=month) # month is an integer
但是没有对周的默认支持,但您仍然可以使用 范围 功能来实现:
import datetime
start_date = datetime.date(2015, 12, 16)
end_date = start_date + datetime.timedelta(days=7)
person_1.tests.filter(date__range=(start_date, end_date))
示例:
在 views.py 中:
def get_current_month():
now = datetime.now()
return now.strftime("%m")
def get_current_year():
now = datetime.now()
return now.strftime("%y")
def tests_by_month(request, id):
person = Person.objects.get(id=id)
month = request.GET.get('month', get_current_month()) # if no month take the current as default
year = request.GET.get('month', get_current_year()) # if no year take the current as default
test_list = person.tests.filter(date__month=int(month), date__year=int(year))
context = {'test_list': test_list}
return render_to_response(request, 'template.html', context)
在 urls.py 中:
url(r'^app/persons/(?P<id>\d+)/tests/', tests_by_month),
并且您使用以下网址
app/persons/(?P<id>\d+)/tests/?month=12&year=2014
如果您发送没有月份:
app/persons/(?P<id>\d+)/tests/
,您将获得当月和当年的测试关于python - django 以每周每月每天的方式对查询元素进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34307663/