97 lines
2.0 KiB
Markdown
97 lines
2.0 KiB
Markdown
# Django
|
|
|
|
Session.objects.filter(timestamp_start__year=2024)
|
|
|
|
# JSON
|
|
```json
|
|
{
|
|
"type": "session_start",
|
|
"operator": "equals",
|
|
"value": "2024"
|
|
}
|
|
```
|
|
|
|
# HTML
|
|
```html
|
|
<select name="filters">
|
|
<option value='[{"type": "session_start", "operator": "equals", "value": "2024"}]'>2024</option>
|
|
<option value='[{"type": "session_start", "operator": "equals", "value": "2023"}]'>2023</option>
|
|
</select>
|
|
```
|
|
|
|
# Python: Python -> HTML
|
|
```python
|
|
filters = [
|
|
{
|
|
"type": "session_start",
|
|
"operator": "equals",
|
|
"value": "2024"
|
|
}
|
|
]
|
|
|
|
# predefined values
|
|
session_start_select = Select(name="filters", children=session_start_options)
|
|
session_start_options = [
|
|
Option(value=create_filter("session_start", "equals", value=year))
|
|
for year in range(2000, 2024)
|
|
]
|
|
|
|
# user-selected values
|
|
|
|
|
|
```
|
|
|
|
# Python: JSON -> Django
|
|
```python
|
|
filter_types = {
|
|
"session_start": {
|
|
"equals": "timestamp_start__exact=",
|
|
"isnull": "timestamp_start__exact=None",
|
|
"greater_than": "timestamp_start__gt=",
|
|
"less_than": "timestamp_start__lt=",
|
|
},
|
|
}
|
|
# filter_string = request.GET.get("filters")
|
|
filter_string = """
|
|
{
|
|
"type": "session_start",
|
|
"operator": "equals",
|
|
"value": "2024"
|
|
}
|
|
"""
|
|
def string_to_django_filter_dict(s: str):
|
|
if s[-1] == "=":
|
|
s + value
|
|
key, value = s.split("=")
|
|
return {key: value}
|
|
|
|
filter_obj = json.loads(filter_string)[0]
|
|
field, operator, value = filter_obj
|
|
|
|
if type in filter_types:
|
|
if operator in filter_types[type]:
|
|
queryset.filter(Q(**string_to_django_filter_dict(filter_types[type][operator])}))
|
|
else:
|
|
return False
|
|
```
|
|
|
|
# Python: Django -> JSON -> URI param
|
|
```python
|
|
filters = [
|
|
{
|
|
"type": "session_start",
|
|
"operator": "equals",
|
|
"value": "2024"
|
|
}
|
|
]
|
|
context = {
|
|
"filters": json.dumps(filters)
|
|
}
|
|
return render("filter.html", context)
|
|
```
|
|
|
|
# Python: Django -> JSON (function)
|
|
```python
|
|
create_filter("session_start", "operator": "equals", "value": "2024")
|
|
```
|