Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django所有相关数据_Django_Django Models - Fatal编程技术网

Django所有相关数据

Django所有相关数据,django,django-models,Django,Django Models,如果这个答案在别处很容易找到,我提前表示歉意。我已经搜索了所有地方,没有看到一个简单的方式来直观地查询我的数据,因为我觉得应该是可能的 这些是3张桌子的类。实际数据集接近100个表。每个文档id可以有一个或多个关联的活动id。每个活动标识与一个分析标识相关联 我的目标是在单个文档中获取每个活动的所有相关数据。例如: class Docs(models.Model): doc_id = models.BigIntegerField(primary_key=True) journal

如果这个答案在别处很容易找到,我提前表示歉意。我已经搜索了所有地方,没有看到一个简单的方式来直观地查询我的数据,因为我觉得应该是可能的

这些是3张桌子的类。实际数据集接近100个表。每个文档id可以有一个或多个关联的活动id。每个活动标识与一个分析标识相关联

我的目标是在单个文档中获取每个活动的所有相关数据。例如:

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)