对于未来的人。我已经取消了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'
2件事情:尝试'itertools.chain.from_iterable([jobdtlquery,jobmstquery])如果这不起作用,你可以更新整个堆栈跟踪的问题? – karthikr
做你的建议给 - 名字'itertools'没有定义,所以我在api.py的开头添加了“import itertools”,现在出现错误,因为'itertools chain'对象没有属性'model'。 至于stacktrace仍然试图弄清楚如何在tastypie中启用它,因为我在shell中获得的所有内容都是api调用。 – whoisearth