2015-02-10 47 views
1

我正在構建一個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請求後填充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

所以我去了一個典型的方法,通過簡單地定義爲模型管理員使用的一種形式得到這個工作;

# 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)