2013-12-17 38 views
0

對於未來的人。我已經取消了tastypie,並且使用了Django-Rest-Framework和itertools,正如在這個問題的批准答案中所建議的那樣。tastypie使用itertools鏈

我有一個2模型我想鏈接結果,因爲它們與FK相關聯。

我做了類在我API.py如下 -

class JobmstResource(ModelResource): 
    jobdtl_id = fields.ForeignKey(JobdtlResource, 'jobdtl_id') 
    class Meta: 
     jobdtlquery = Jobdtl.objects.using('Admiral').all() 
     jobmstquery = Jobmst.objects.using('Admiral').all() 
     queryset = chain(jobdtlquery, jobmstquery) 
     resource_name = 'Jobmst' 

然後我打我的API從URL調用一個ID(在這兩個查詢共同的ID)。

http://localhost:8080/api/jobmst/3296/?format=xml 

當我運行它,它不能抱怨 -

「itertools.chain」對象有沒有屬性「模型」

似乎Django的沒有乾淨,清晰的方式做內當你想要超過1個模型的結果,因此好奇在哪裏休息?我應該以不同的方式攻擊。

如果我從一個簡單的HTML查看查詢,它將顯示結果,但將值分隔爲2個模型字段和全部。

我想讓值顯示爲來自1個模型。

下面是2款有問題的models.py -

class Jobdtl(models.Model): 
    jobdtl_id = models.IntegerField(primary_key=True) 
    jobdtl_cmd = models.TextField(blank=True) 
    jobdtl_envfile = models.TextField(blank=True) 
    jobdtl_retnsn = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_allowadhoc = models.CharField(max_length=1, blank=True) 
    jobdtl_waitop = models.CharField(max_length=1, blank=True) 
    jobdtl_fromdt = models.DateTimeField(blank=True, null=True) 
    jobdtl_untildt = models.DateTimeField(blank=True, null=True) 
    jobdtl_fromtm = models.DateTimeField(blank=True, null=True) 
    jobdtl_untiltm = models.DateTimeField(blank=True, null=True) 
    jobdtl_proxy = models.ForeignKey('Usrmst', db_column='jobdtl_proxy', related_name='Jobdtl_jobdtl_proxy',blank=True, null=True) 
    jobdtl_proxy2 = models.ForeignKey('Usrmst', db_column='jobdtl_proxy2', related_name='Jobdtl_jobdtl_proxy2',blank=True, null=True) 
    jobdtl_interval = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_intervalcnt = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_unit = models.CharField(max_length=1, blank=True) 
    jobdtl_duration = models.IntegerField(blank=True, null=True) 
    jobdtl_concur = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_priority = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_minrun = models.IntegerField(blank=True, null=True) 
    jobdtl_maxrun = models.IntegerField(blank=True, null=True) 
    jobdtl_failalarm = models.CharField(max_length=1, blank=True) 
    nodmst_id = models.ForeignKey('Nodmst', db_column='Nodmst_id', related_name='Jobdtl_Nodmst_id', blank=True, null=True) 
    nodlstmst_id = models.ForeignKey('Nodlstms', db_column='Nodlstmst_id', related_name='Jobdtl_Nodlstmst_id',blank=True, null=True) 
    jobdtl_inhevent = models.CharField(max_length=1, blank=True) 
    jobdtl_inhoptions = models.CharField(max_length=1, blank=True) 
    jobdtl_inhagent = models.CharField(max_length=1, blank=True) 
    jobdtl_inhrepeat = models.CharField(max_length=1, blank=True) 
    jobdtl_inhtime = models.CharField(max_length=1, blank=True) 
    jobdtl_timewin = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_saveoutput = models.CharField(max_length=1, blank=True) 
    jobdtl_outputname = models.TextField(blank=True) 
    jobdtl_trackmethod = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_trackcmd = models.TextField(blank=True) 
    jobdtl_deplogic = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_rerun = models.CharField(max_length=1, blank=True) 
    jobdtl_params = models.TextField(blank=True) # This field type is a guess. 
    jobdtl_sapcount = models.IntegerField(blank=True, null=True) 
    jobdtl_normalexit = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_normalrange = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_normalop = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_deprerun = models.CharField(max_length=1, blank=True) 
    jobdtl_carryover = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_psjob = models.IntegerField(blank=True, null=True) 
    jobdtl_savelogonly = models.CharField(max_length=1, blank=True) 
    jobdtl_trxid = models.IntegerField(blank=True, null=True) 
    jobdtl_rerunok = models.CharField(max_length=1, blank=True) 
    jobdtl_workdir = models.TextField(blank=True) 
    jobdtl_extinfo = models.TextField(blank=True) # This field type is a guess. 
    servicemst_id = models.ForeignKey('Servicemst', db_column='Servicemst_id', blank=True, null=True) 
    jobdtl_estmethod = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_nearoutage = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_trackcl = models.CharField(max_length=1, blank=True) 
    jobdtl_statuscl = models.CharField(max_length=1, blank=True) 
    jobdtl_abrtonclderr = models.CharField(max_length=1, blank=True) 
    jobdtl_estdurexclude = models.IntegerField(blank=True, null=True) 
    class Meta: 
     managed = False 
     db_table = 'jobdtl' 

class Jobmst(models.Model): 
    jobmst_id = models.IntegerField(primary_key=True) 
    jobmst_type = models.SmallIntegerField() 
    jobmst_prntid = TreeForeignKey('self', null=True, blank=True, related_name='children', db_column='jobmst_prntid') 
    jobmst_active = models.CharField(max_length=1, blank=True) 
    evntmst_id = models.IntegerField(blank=True, null=True) 
    jobmst_evntoffset = models.SmallIntegerField(blank=True, null=True) 
    jobmst_name = models.TextField(db_column='jobmst_name', blank=True) 
    jobmst_mode = models.SmallIntegerField(blank=True, null=True) 
    jobmst_owner = models.ForeignKey('Owner', db_column='jobmst_owner', related_name = 'Jobmst_Jobmst_owner', blank=True, null=True) 
    jobmst_desc = models.TextField(blank=True) # This field type is a guess. 
    jobmst_crttm = models.DateTimeField() 
    jobdtl_id = models.ForeignKey('Jobdtl', db_column='jobdtl_id', blank=True, null=True) 
    jobmst_lstchgtm = models.DateTimeField(blank=True, null=True) 
    jobmst_runbook = models.TextField(blank=True) # This field type is a guess. 
    jobcls_id = models.IntegerField(blank=True, null=True) 
    jobmst_prntname = models.TextField(blank=True) 
    jobmst_alias = models.CharField(max_length=10, blank=True) 
    jobmst_dirty = models.CharField(max_length=1, blank=True) 
    class MPTTMeta: 
     order_insertion_by = ['jobmst_id'] 
    class Meta: 
     managed = True 
     db_table = 'jobmst' 
+0

2件事情:嘗試'itertools.chain.from_iterable([jobdtlquery,jobmstquery])如果這不起作用,你可以更新整個堆棧跟蹤的問題? – karthikr

+0

做你的建議給 - 名字'itertools'沒有定義,所以我在api.py的開頭添加了「import itertools」,現在出現錯誤,因爲'itertools chain'對象沒有屬性'model'。 至於stacktrace仍然試圖弄清楚如何在tastypie中啓用它,因爲我在shell中獲得的所有內容都是api調用。 – whoisearth

回答

1

您是否嘗試過轉換itertools.chain到一個列表:

queryset = list(chain(jobdtlquery, jobmstquery)) 

更新您可以連接上查詢相同的型號是這樣的:

queryset = query1 | query2 

更新如錯誤消息所示,您的查詢集必須只有一個model。你不能用兩種不同的模式實現你的目標。

這個問題好像是dublicate

+0

是的,它給出了同樣的錯誤。 – whoisearth

+0

我已經更新了答案,你有沒有嘗試用'''''操作符連接查詢集? – niekas

+0

「不能在兩個不同的基礎模型上組合查詢」 – whoisearth

0

由於ResourceModel允許REST客戶端進行篩選,分頁和排序查詢,然後觸發相應的SQL查詢,所以不可能僅使用不能靈活的迭代器。

也許你可以破解一些可行的東西,但看起來最乾淨的東西是使用簡單的資源並添加自己的邏輯。看到這個答案Tastypie: How can I fill the resource without database?這是指文檔中的資源VS ModelResource http://django-tastypie.readthedocs.org/en/latest/resources.html#why-resource-vs-modelresource