Django所有相关数据
如果这个答案在别处很容易找到,我提前表示歉意。我已经搜索了所有地方,没有看到一个简单的方式来直观地查询我的数据,因为我觉得应该是可能的 这些是3张桌子的类。实际数据集接近100个表。每个文档id可以有一个或多个关联的活动id。每个活动标识与一个分析标识相关联 我的目标是在单个文档中获取每个活动的所有相关数据。例如:Django所有相关数据,django,django-models,Django,Django Models,如果这个答案在别处很容易找到,我提前表示歉意。我已经搜索了所有地方,没有看到一个简单的方式来直观地查询我的数据,因为我觉得应该是可能的 这些是3张桌子的类。实际数据集接近100个表。每个文档id可以有一个或多个关联的活动id。每个活动标识与一个分析标识相关联 我的目标是在单个文档中获取每个活动的所有相关数据。例如: class Docs(models.Model): doc_id = models.BigIntegerField(primary_key=True) journal
class Docs(models.Model):
doc_id = models.BigIntegerField(primary_key=True)
journal = models.CharField(max_length=50, blank=True, null=True)
year = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'docs'
class Assays(models.Model):
assay_id = models.BigIntegerField(primary_key=True)
doc = models.ForeignKey('Docs', models.DO_NOTHING)
description = models.CharField(max_length=4000, blank=True, null=True)
class Meta:
managed = False
db_table = 'assays'
class Activities(models.Model):
activity_id = models.BigIntegerField(primary_key=True)
assay = models.ForeignKey(Assays, models.DO_NOTHING)
doc = models.ForeignKey(Docs, models.DO_NOTHING, blank=True, null=True)
record = models.ForeignKey('CompoundRecords', models.DO_NOTHING)
class Meta:
managed = False
db_table = 'activities'
这将为活动表中doc_id=5535的列返回32个字典(仅显示第一个字典的一部分)。我想更进一步,并自动从分析表中提取与每个字典的相应分析id相关联的所有数据
我可以通过类似的查询访问该分析数据,但只能明确说明每个字段:
query_activities_values = Docs.objects.get(doc_id=5535).activities_set.values()
for y in query_activities_values:
print(y)
break
>>> {'activity_id': 753688, 'assay_id': 158542, 'doc_id': 5535, .....
我想要一个查询,不仅可以查找一个活动id的分析和相关分析数据,还可以查找模型中相关的90多个其他表的所有数据和相关数据
多谢各位
更新1
我确实发现这段代码非常适合我的需要,但是我很好奇这是否是最好的方法:
从django.forms.models将模型导入到
def系列_型号(modelobj):
opts=modelobj.\u元字段
modeldict=model_to_dict(modelobj)
对于m in选项:
如果m.is_关系:
foreignkey=getattr(modelobj,m.name)
如果是外键:
尝试:
modeldict[m.name]=串行_模型(外键)
除:
通过
返回modeldict
这不是太多的代码,但我认为可能有一种更内置的方法来实现这一点。您需要的是与预取相关的: 将成为:
query_activities_values = Docs.objects.get(doc_id=5535).activities_set.values()
将创建一个名为“活动”和“分析”的新属性,可用于检索数据
还有一件事。这实际上不是一个查询。现在是3点。但是,如果您从文档中获取的对象不止一个,那么它仍然是3个
另外,您使用BigIntegerField有什么原因吗?谢谢!首先,不,我使用BigIntegerField没有什么特别的原因。这是一个遗留数据库,这是inspectdb分配的。我读到这些应该改变,但我还没有深入研究,因为它似乎并没有影响任何事情。所以我知道,使用预取相关的缓存,这些显式定义的属性,但是,它们仍然必须显式调用。对于一个由连接表组成的大型web,显式定义每个链接表并显式查询每个链接表涉及到大量代码。如果收到大量通知,请道歉。我在注释中的代码格式方面遇到了困难,只是阅读了一些内容,将我的代码作为更新发布在原始问题中,而不是在注释中。再次感谢。
query_activities_values = Docs.objects.get(doc_id=5535).activities_set.values()
query_activities_values = Docs.objects.prefetch_related(models.Prefetch("activities_set", to_attr="activities"), models.Prefetch("assays_set", to_attr="assays")).get(doc_id=5535)