我正在构建一个Django应用程序,通过API提取数据,以跟踪事件的实时结果,并增加了在显示之前覆盖该数据的能力。
该应用程序的第一项任务是发出请求并将响应存储在数据库中,以便我设置模型;
class ApiData(models.Model):
event = models.CharField(
_("Event"),
max_length=100,
)
key = models.CharField(
_("Data identifier"),
max_length=255,
help_text=_("Something to identify the json stored.")
)
json = JSONField(
load_kwargs={'object_pairs_hook': collections.OrderedDict},
blank=True,
null=True,
)
created = models.DateTimeField()
理想情况下,我希望在管理员中创建对象,并且在根据对象中的其他选项创建API请求后,save方法会填充ApiData.json
字段。
因为这些字段会根据从API返回的数据做出选择,所以我希望延迟加载选项,但目前我只是在表单中获得标准Charfield()
。
这是延迟加载模型字段选择的正确方法吗?或者我应该创建一个自定义ModelForm
并在那里加载选项? (这可能是我猜的更典型的方法)
def get_event_choices():
events = get_events()
choices = []
for event in events['events']:
choices.append((event['name'], event['title']),)
return choices
class ApiData(models.Model):
# Fields as seen above
def __init__(self, *args, **kwargs):
super(ApiData, self).__init__(*args, **kwargs)
self._meta.get_field_by_name('event')[0]._choices = lazy(
get_event_choices, list
)()
答案 0 :(得分:0)
所以我通过简单地定义模型管理员使用的表单来寻求一种典型的方法来实现这个目的;
# forms.py
from django import forms
from ..models import get_event_choices, ApiData
from ..utils.api import JsonApi
EVENT_CHOICES = get_event_choices()
class ApiDataForm(forms.ModelForm):
"""
Form for collecting the field choices.
The Event field is populated based on the events returned from the API.
"""
event = forms.ChoiceField(choices=EVENT_CHOICES)
class Meta:
model = ApiData
# admin.py
from django.contrib import admin
from .forms.apidata import ApiDataForm
from .models import ApiData
class ApiDataAdmin(admin.ModelAdmin):
form = ApiDataForm
admin.site.register(ApiData, ApiDataAdmin)