回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个由创建的遗留数据库的模型管理.pyinspectdb,它访问settings中名为“edlserver”的数据库,该数据库是用于该项目的许多数据库之一。我无法更改数据库布局。在</p>
<p>它有以下类(在其他不相关的类中):</p>
<p>一个用于记录条目。在</p>
<pre><code>class Logs(models.Model):
time = models.DateTimeField()
job = models.ForeignKey(Jobs, models.DO_NOTHING, db_column='id_job')
msg = models.TextField()
class Meta:
managed = False
db_table = 'logs'
</code></pre>
<p>作业的另一个(作业字段引用)</p>
^{pr2}$
<p>还有一个是关于工作类型的。在</p>
<pre><code>class JobTypes(models.Model):
name = models.CharField(max_length=255)
max_processes = models.IntegerField()
class Meta:
managed = False
db_table = 'job_types'
</code></pre>
<p>django rest框架的视图如下所示</p>
<pre><code>class EDLLogList(generics.ListAPIView):
serializer_class = EDLLogsSerializer
filter_backends = (filters.DjangoFilterBackend, )
filter_class = EDLLogsFilter
def get_queryset(self):
if not 'job_name' in self.request.GET:
raise ParameterRequired('job_name')
else:
return Logs.objects.all().using('edlserver')
</code></pre>
<p>它使用过滤器:</p>
<pre><code>class EDLLogsFilter(filters.FilterSet):
time_start = django_filters.DateTimeFilter(name="time", lookup_type='gte')
time_end = django_filters.DateTimeFilter(name="time", lookup_type='lte')
job_name = django_filters.MethodFilter()
class Meta:
model = Logs
fields = ()
def filter_job_name(self, queryset, job_name):
try:
q = queryset.filter(job__job_type__name=job_name)[:10000]
except:
raise InternalError()
if len(q) < 1 and
len(JobTypes.objects.all().using('edlserver').filter(name=job_name)) < 1:
raise InvalidParameter(job_name, 'job_name')
else:
return q
</code></pre>
<p>以及序列化程序:</p>
<pre><code>class EDLLogsSerializer(serializers.HyperlinkedModelSerializer):
time = serializers.DateTimeField()
job_name = serializers.SerializerMethodField()
message = serializers.SerializerMethodField()
class Meta:
model = Logs
fields = ('job_name','time', 'message')
def get_job_name(self, obj):
return obj['id_job__id_job_type__name']
def get_message(self, obj):
return obj.msg
</code></pre>
<p>问题是我在序列化程序的<code>get_job_name()</code>中得到一个来自psycopg2模块的<code>TypeError: 'Logs' object is not subscriptable</code>,但是数据库是一个MySQL数据库。在调试期间,第一个查询有一个len>;0的queryset,这一事实表明模型是正常的,django使用MySQL后端来获取数据。在解析外键时出了问题,使用了默认数据库(我认为是PostGreSQL)。在</p>
<p>这是虫子吗?在</p>
<p>如果没有,我能做什么?我在想一个路由器,它可以解析一个元域。这意味着其他车型会有很大的变化,所以我不想这么做。有什么想法吗?在</p>
<p>编辑:数据库的设置</p>
<pre><code>'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'pic',
'USER' : 'pic-5437',
'PASSWORD' : '',
'HOST' : 'host1.url.com',
'PORT' : '5432'
},
'...' : {
...
},
'edlserver': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'host2.url.com',
'NAME': 'edl',
'USER': 'edl_ro',
'PASSWORD': '',
}
</code></pre>